glibc与msvc CRT

什么是运行库

运行库是平台相关的,因为它与操作系统结合得非常紧密。C语言的运行库从某种程度上来讲是C语言的程序和不同操作系统平台之间的抽象层,它将不同操作系统的API抽象成相同的库函数。比如我们可以在不同操作系统平台下使用fread来读取文件,而事实上fread在不同操作系统平台下的实现是不同的,但是作为运行库使用者我们不需要关心这一点。虽然各个平台下的C语言运行库提供了很多功能,但是很多时候他们毕竟有限,比如用户权限控制、操作系统线程创建等都不属于标准的C语言运行库,于是我们不得不通过其他方法,诸如,绕过C语言运行库直接调用操作系统API或使用其他的库。Linux和Windows平台下的两个主要运行库分别是glibc(GUN C libarary)和MSVCRT(Microsoft Visual C Run-time)。
glibc和MSVCRT事实上是标准C语言运行库的超集,它们各自对C标准库进行了一些扩展。

glibc

glibc为Linux的的默认的C运行库。glibc的发行版本由2部分组成,一部分是头文件,如stdio.h、stdlib.h等,它们往往位于/usr/include;另一部分则是库的二进制文件部分。二进制部分主要的就是C语言的标准库,它由静态和动态2个版本。它们分别是动态库/lib/libc.so.6和静态库/usr/lib/libc.a。事实上glibc除了C标准库之外还有几个辅助程序运行的运行库,这几个文件可以称得上是真正的运行库,它们就是/usr/lib/crt1.o、/usr/lib/crti.o和/usr/lib/crtn.o。

glibc 启动文件

crt1.o里面包含的就是程序的入口函数__start,由它负责调用__libc_start_main初始化libc并调用main函数进入真正的程序主体。

MSVC CRT

同一个版本的MSVC CRT根据不同的属性提供了多种子版本,以供不同的需求的开发者使用。按照静态/动态连接分为动态版和静态版,根据单线程/多线程分为单线程版和多线程版;按照调试/发布,可分为调试版和发布版;按照是否支持C++分为纯C运行版和支持C++版;按照是否支持托管分为支持本地代码/托管代码合纯托管代码。这些属性很多时候是可以相关正交的,也就是说他们之间是可以相互组合的。比如可以有静态单线程纯C本地代码调试版;也可以有动态多线程纯C本地代码发布版。但是有些组合是没有的比如动态链接版本的CRT是没有单线程的,所有的动态CRT都是单线程安全的。
由于这样的不同组合会出现非常多的子版本,所以微软提供了一套运行库的命名方法。静态版和动态版是完全不一样的。静态版的CRT在MSVC安装目录下的lib/,比如VC++2008的静态库路径为“Program Files\Microsoft Visual Studio 9.0\VC\lib”,命名规则是:
libc[p][mt][d].lib

  • p表示C Plusplus,即C++标准
  • mt表示Multi-Thread,即表示支持多线程。
  • d表示Debug,即表示调试版本
    比如静态的非C++的多线程的CRT的文件名为libcmtd.lib。动态版的CRT的每个版本一般有2个对应的文件,一个用于连接的.lib文件,与一个和用于运行时的.dll动态库。

来源:《程序员的自我修养》

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值