当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么运行时库是编译器选项而不是链接器选项?》经验,为你挑选了2个好方法。

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

/ MT - 静态运行时库

/ MD - DLL运行时库

/ MTd - 调试静态运行时库

/ MDd - 调试DLL运行时库

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



1> zdan..:

这些选项可能会添加运行时库头文件中使用的定义(例如__DLL和_​​_DEBUG).一个常见的事情是在动态链接时将__declspec(dllimport)添加到函数声明中.

编译器似乎也使用这些来帮助链接器链接到正确的库.这在MSDN中进行了解释.



2> bk1e..:

C预处理器定义的一个副作用是_DLL_DEBUGzdan提到的:

某些数据结构(例如STL容器和迭代器)在调试运行时的大小可能不同,可能是由于诸如_HAS_ITERATOR_DEBUGGING和之类的功能_SECURE_SCL.您必须使用与要链接的库二进制兼容的结构定义来编译代码.

如果混合并匹配针对不同运行时库编译的目标文件,您将收到链接器警告,如下所示:

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

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有