C 运行时库
- C 运行时库与平台相关
- C 运行时库 = C 标准库 + 系统相关的库
- 一个C 运行库大致包含了如下功能:
- 启动与退出:包括入口函数及入口函数所依赖的其他函数等
- 标准函数:由C语言标准规定的C语言标准库所拥有的函数实现(C标准库)
- I/O:I/O功能的封装和实现,参见上一节中I/O初始化部分
- 堆:堆的封装和实现,参见上一节中堆初始化部分
- 语言实现:语言中一些特殊功能的实现
- 调试:实现调试功能的代码
- 早期的C Runtimes 并不支持动态链接库,但Visual C++ 4.0 之后已支持,并且在32 位操作系统中已不再有small/large 等内存模式之分。
VC 运行时库
- 根据对运行时库的选择,一共有六种:
- 静态链接
- /ML –> Single-Threaded(static) –> libc.lib –> 自MSVC 2005 开始被删除
- /MLd –> Debug Single-Threaded(static) –> libcd.lib –> 自MSVC 2005 开始被删除
- /MT –> Multithreaded(static) –> libcmt.lib
- /MTd –> Debug Multithreaded(static) –> libcmtd.lib
- 动态链接
- /MD –> Multithreaded DLL –> msvcrt.lib –> 依赖msvcrtxx.dll
- /MDd –> Debug Multithreaded DLL –> msvcrtd.lib –> 依赖msvcrtdxx.dll
- 静态链接
- msvcrt.lib 是VC 运行时库的动态链接版本(/MD)的import 函数库,使用该链接库,程序执行时必须有msvcrtxx.dll。
VC++ 运行时库
- 只要程序中#include 了任何一个C++ 头文件,如
iostream
或fstream
,MSVC 就会在链接阶段自动链接C++ 的运行时库 - VC++ 运行时库有四个版本:
- 静态链接
- libcpmt.lib
- libcpmtd.lib
- 动态链接
- msvcprt.lib –> 依赖msvcpxx.dll
- msvcprtd.lib –> 依赖msvcpdxx.dll
- 静态链接
Windows API
- Windows 程序调用的函数可分为C Runtimes 以及Windows API 两大部分
- Windows API,由操作系统本身(主要是Windows三大模块GDI32.DLL和USER32.DLL和KERNEL32.DLL)提供
- 虽说动态链接是在执行时期才发生“链接”事实,但在链接时期,链接器仍需先为调用者(应用程序本身)准备一些适当的信息,才能够在执行时期顺利“跳”到DLL中执行。如果该API所属的函数库尚未加载,系统也才因此知道要先行加载该函数库。这些适当的信息放在所谓的import 函数库中
- Windows发展至今,逐渐加上的一些新的API函数并不放在GDI和USER和KERNEL三大模块中,而是放在诸如COMMDLG.DLL、TOOLHELP.DLL之中。如果要使用这些APIs,链接时还得加上这些DLLs所对应的import函数库,诸如COMDLG32.LIB和TH32.LIB
Windows 三大模块
- import 函数库
- GDI –> Gdi32.Lib
- USER –> User32.Lib
- KERNEL –> Kernel32.Lib