c++ 为什么运行时库是编译器选项,而不是链接器选项?

我正在使用visual studio 2005构建一个C/C++静态库.由于运行时库的选择是一个编译选项,因此我不得不构建我的库的四个变体,每个变体的运行时库有一个变体:

> / MT – 静态运行时库
> / MD – DLL运行时库
> / MTd – 调试静态运行时库
> / MDd – 调试DLL运行时库

这些是编译选项,而不是链接器选项.来自Linux背景,这似乎很奇怪.不同的运行时库有不同的调用约定吗?为什么不能在链接时解析不同的运行时库,即当我链接使用静态库的应用程序?

最佳答案
zdan提到的C预处理器定义如_DLL和_​​DEBUG的一个副作用是:

一些数据结构(如STL容器和迭代器)的大小可能在调试运行时的大小不同,这可能是由于诸如_HAS_ITERATOR_DEBUGGING和_SECURE_SCL之类的功能.您必须使用structure definitions that are binary-compatible with the library you’re linking to编译代码.

如果混合并匹配根据不同运行时库编译的对象文件,您将获得链接器警告,如下所示:

warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs

转载注明原文:c++ 为什么运行时库是编译器选项,而不是链接器选项? - 代码日志