"运行时库"(Runtime Library)是指程序在运行期间所依赖的一组标准库函数,比如 C/C++ 标准库(如 printf、malloc、std::vector 等)的实现。这些库在程序执行时提供基础功能支持。
在 Windows 平台使用 Microsoft Visual C++(MSVC)编译器时,链接运行时库的方式可以通过编译选项 /MT 和 /MD 来指定。它们的主要区别在于 如何链接 C/C++ 运行时库(CRT, C Runtime Library):
1. /MT:静态链接运行时库
- 含义 :将 C/C++ 运行时库 静态链接 到你的可执行文件或 DLL 中。
- 结果 :
- 生成的程序 不依赖 系统上是否安装了 Visual C++ Redistributable(即 VC++ 可再发行组件包)。
- 可执行文件体积更大(因为包含了 CRT 的代码)。
- 多个模块(如 EXE 和 DLL)各自包含一份 CRT 副本,可能导致:
- 内存分配/释放跨模块出错(例如在一个 DLL 中用
new分配内存,在 EXE 中用delete释放,若 CRT 不同则可能崩溃)。 - 全局状态(如
errno、_set_se_translator)不共享。
- 内存分配/释放跨模块出错(例如在一个 DLL 中用
- 适用场景:希望程序独立分发、避免依赖外部运行时的情况。
2. /MD:动态链接运行时库
- 含义 :将 C/C++ 运行时库 动态链接 ,即程序在运行时从系统 DLL(如
msvcr140.dll、ucrtbase.dll等)加载 CRT。 - 结果 :
- 生成的程序 依赖 安装对应版本的 Visual C++ Redistributable。
- 可执行文件体积更小。
- 所有模块(EXE、DLL)共享同一个 CRT 实例,避免内存管理不一致等问题。
- 更容易更新 CRT(通过更新系统上的 DLL)。
- 适用场景:大多数常规 Windows 应用程序,尤其是需要多个 DLL 协作的项目。
补充说明:
- 调试版本 对应选项为
/MTd和/MDd(带d表示 debug),分别用于调试构建,链接调试版 CRT(如msvcrtd.lib)。 - 一致性要求 :整个项目(包括所有静态库、DLL、EXE)必须使用 相同的运行时库选项,否则可能导致链接错误或运行时崩溃。
- 从 Visual Studio 2015 开始,CRT 被拆分为 UCRT(Universal CRT) 和 VC++ 工具集特定部分 ,但
/MT//MD的基本逻辑不变。
总结对比表:
| 选项 | 链接方式 | 是否依赖 VC++ Redist | 文件大小 | 模块间 CRT 共享 | 适用场景 |
|---|---|---|---|---|---|
/MT |
静态链接 | 否 | 较大 | 否(各模块独立) | 独立部署、小型工具 |
/MD |
动态链接 | 是 | 较小 | 是(共享 DLL) | 通用应用、大型项目 |
选择 /MT 还是 /MD 应根据你的部署需求、模块架构和维护策略综合考虑。