我正在尝试使用visual studio 2005构建一个C/C++静态库.由于选择运行时库是一个编译选项,我不得不构建我的库的四个变体,一个用于运行时库的每个变体:
/ MT - 静态运行时库
/ MD - DLL运行时库
/ MTd - 调试静态运行时库
/ MDd - 调试DLL运行时库
这些是编译器选项,而不是链接器选项.来自Linux背景,这看起来很奇怪.不同的运行时库是否有不同的调用约定?为什么不能在链接时解析不同的运行时库,即当我链接使用我的静态库的应用程序时?
这些选项可能会添加运行时库头文件中使用的定义(例如__DLL和__DEBUG).一个常见的事情是在动态链接时将__declspec(dllimport)添加到函数声明中.
编译器似乎也使用这些来帮助链接器链接到正确的库.这在MSDN中进行了解释.
C预处理器定义的一个副作用是_DLL
和_DEBUG
zdan提到的:
某些数据结构(例如STL容器和迭代器)在调试运行时的大小可能不同,可能是由于诸如_HAS_ITERATOR_DEBUGGING
和之类的功能_SECURE_SCL
.您必须使用与要链接的库二进制兼容的结构定义来编译代码.
如果混合并匹配针对不同运行时库编译的目标文件,您将收到链接器警告,如下所示:
warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs