首页
社区
课程
招聘
[求助]C/C++运行时库是什么东西
发表于: 2015-9-27 22:50 8098

[求助]C/C++运行时库是什么东西

2015-9-27 22:50
8098
exe不是已经被编译成机器码了吗,要执行它,创建任务以后直接将指令指针指向程序入口就是了,还要那个什么C/C++运行时库干什么啊,我也没有看出来,我什么时候使用这个库了?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 18
活跃值: (1059)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
这个东西是编译器自带的运行库,代码生成有两种,一种是静态生成,把系统库(如string.h这样的C库)直接编译为二进制代码;另一种就是运行时库,运行时使用系统提供的函数或者某些代码。

下面来自维基百科的解释。
运行时库(runtime library,又称运行期库),在计算机程序设计领域中,是指一种被编译器用来实现编程语言内置函数以提供该语言程序运行时(执行)支持的一种特殊的计算机程序库。这种库一般包括基本的输入输出或是内存管理等支持。它是一群支持正在运行程序的函数,与操作系统合作提供诸如数学运算、输入输出等功能,让程序写作者不需要“重新发明轮子”,并善用操作系统提供的功能。

运行时库由编译器决定,以面向编程语言,提供其最基本的执行时需要。比如Visual Basic需要复杂的运行时库支持而C的运行时库则相对简单。当然这还是由编译器厂商决定的。运行时库中的函数可能对程序员透明,也可能不透明。这也是由编译器厂商忖度语言执行环境的需求而决定的。

早期的运行期库(例如Fortran)提供了数学运算的能力。其他语言增加了诸如垃圾回收的先进功能,通常用于支持对象数据结构。

许多近代语言设计了更大的运行环境并添加更多功能。很多面向对象语言也包含了分派器与类读取器。Java虚拟机(JVM)便是此类的典型运行环境:它也在运行期直译或编译具可携性的二进制Java程序。而.NET架构也是另外一个运行期库的实例。

异常处理(Exception handling)是专门处理运行期错误的语言机制,使程序员可以完全捕捉非预期错误,或没有适当处理的错误结果。

动态链接库或静态链接库与运行时库的分类角度不同,不得相提并论。
2015-9-27 22:58
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这不是废话吗,我还不知道运行时库就是一堆函数? 不管他动态也好,不动态也好,我是问我什么时候调用它了
2015-9-27 23:09
0
雪    币: 18
活跃值: (1059)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
你的确没调用,但编译器提供的wWinMain函数有调用那些库函数,搜索关键字:wWinMainCRTStartup。
2015-9-27 23:32
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
那好吧,我这样弄行不?应该没有wWinMainCRTStartup吧
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"myMain\"" )
2015-9-27 23:36
0
雪    币: 18
活跃值: (1059)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
没理解你的意思,wWinMain并不是程序真正的入口点,只是编译器提供给你程序的入口点,程序真正的入口点(这里就用到了运行时库)会调用你程序的入口点wWinMain;你的编译器默认包含了下面这些库中的某个或者几个,具体数量根据静态、动态编译方式决定,如果你不需要运行时库,可以忽略这些lib;你上面那样编译不过是因为编译器找不到默认入口点,因为有运行库存在,使用的默认入口点。

版本类型	使用的library	被忽略的library
R  Release	
      单线程	libc.lib	libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
      多线程	libcmt.lib	libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
使用DLL的多线程	
       msvcrt.lib	libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
D   Debug	
      单线程	libcd.lib	libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib
      多线程	libcmtd.lib	libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib
使用DLL的多线程	
       msvcrtd.lib	libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib
2015-9-27 23:51
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
linker.exe不是有个选项是指定入口点的吗/entry:
我现在用/entry:myMain,就是把myMain当入口啊,它说找不到子系统,我也不知道子系统究竟是什么玩意,但是linker.exe是用/subsystem:指定子系统的,于是我就在我的cpp文件开始加了这么一句:#pragam comment(linker,"/subsystem:\"windows\" /entry:\"myMain\"").这就是说,我把程序入口设置为myMain,在源程序中的那个wWinMain也相应的改为myMain,这样以后编译执行都没有问题,那么 wWinMainCRTStartup应该没被调用吧
2015-9-28 00:31
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
如果是vs编译的话,改了入口很蛋疼,最好别改。 特别是用了CString 这类东西
2015-9-28 04:10
0
雪    币: 8201
活跃值: (2706)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
个人意见,没有C/C++运行时库完全可以,不过你不能使用相关库函数吧?反汇编一下lordpe你就会明白一些了
2015-9-28 07:52
0
雪    币: 18
活跃值: (1059)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
10
#pragam comment(linker,"/subsystem:\"windows\" /entry:\"myMain\"")
意思就是指定windows程序,默认入口点是WinMain,因为这个入口点是编译器默认了,你如果需要更改入口点,那么要先忽略掉vc的运行时库,也就是上面那些lib,这样才能指定你自己的入口点.

帮你构建了一个演示程序.
#pragma comment(linker, "/subsystem:\"windows\"")
#pragma comment(linker, "/entry:\"myMain\"")
#if !defined(_DEBUG)
#pragma comment(linker, "/NODEFAULTLIB")
// disable gs protected
// Solution Explorer->Properties->Property Pages->C/C++->Code Generation->Buffer Security Check
#else
#pragma comment(lib,"kernel32.lib")
#endif
int myMain(){
	return 0;
}
2015-9-28 11:20
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
你用vs2010写一个不需要msvcr100D.dll类似的玩意的程序出来
2015-9-28 12:11
0
雪    币: 18
活跃值: (1059)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
12
你要的程序在这里,一个导入函数都没有,上面都给你代码了,难道你还不会?
上传的附件:
2015-9-28 12:38
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
stdio.h中的函数很多都是调用运行库实现的而运行库基本都是对系统api的封装,目的就是为了屏蔽系统差异,在win下就是vc运行库,在linux上是libc(大部分情况是glibc)
2015-9-29 20:07
0
游客
登录 | 注册 方可回帖
返回
//