今天看了一天的有关于运行库的知识,现在做下总结(只限于c):
简单的说运行库里面包含了c语言写的程序要运行所需要的必备函数,比如在Main函数之前,c语言
就要调用一些运行库里面的函数然后对系统和全局变量进行初始化。一个用c语言写的程序可以没有一
些库,比如基本输入输出函数库,大不了在程序中不使用这些输入输出函数就行了,但是却不能没有运
行库,因为运行库里面包含了C语言要运行的必须函数调用,运行库是一种特殊的库,里面包含了系统
必须运行的信息,那么也就是说C语言里面的程序执行流程不止是从main函数开始的,因为在main函数
之前还有其他函数的调用,只是在main函数之前或者在main函数之后调用的函数在绝大多数程序里面都
是相同的,所以C语言就用运行库,在main函数的前面和后面自动的添加进入这些函数调用,省得大家
每次都要重写,太麻烦,那么也就是说如果我们自己写这些运行库函数的话,那么我们就可以不用运行
库吧。
另外在C语言被发明的时候,并没有多线程这个概念,或者说这个概念还不成熟,所以C语言是单任
务运行的,也就是说它的运行方式是一条线,但是到了后来多任务处理的流行,使得C语言的单任务模
式特别不适合一些应用场合,所以这个时候编译器开发商就提供了自己的运行库,这种新的运行库支持
了多线程,多任务的概念。同时也支持标准的C语言运行库,也就是刚开始的运行库。
对于编译器厂商新提供的运行库可以看成是原来的运行库的升级吧,比如原来的运行库只初始化了
一些环境变量,新的运行库不光初始化了原来的环境变量,而且它为了支持多线程,它有可能还初始化
了其他的环境变量,或者做了一些其他的优化操作。这样看来新的运行库能够完成原来的运行库的功能
而原来的运行库却不能完成新的运行库的功能。所以在一些开发环境里面,比如VC,你要用到新的技术
,那么你就要手动配置MS提供的新的运行库,才能使用,否则在连接的时候就会出错。
另外我觉得运行库也只是库函数,只是程序运行必须的,那么它们作为库来用的话,也就是说在程
序进行连接的时候被调用,而程序的连接又分为两种,静态连接和动态连接,静态连接在Windows下就
是.lib,而动态连接在windows下就是.dll,两者的不同在于里面的二进制代码的加载时间不同,比
如.lib文件是在程序进行连接的时候就放进代码里面了,而.dll文件里面的二进制代码要在程序运行的
时候才动态加入。
这里有一个问题就是,动态连接不止是微软才有,其他的系统下面或者开发环境下面也有,不过只
是不叫.dll。但是是一个概念。
我在想如果库里面仅仅只是二进制代码,那么只要放到相同的硬件上,那么任何程序都可以去调用
并且执行它,只是需要知道它的调用方法,因为程序在运行的时候,代码和代码是没有差别的,只有不
同的指令体系结构的代码才不同。