首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么运行库是编译器选项而不是链接器选项?

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

Stack Overflow用户
提问于 2009-02-06 20:07:27
回答 6查看 3.5K关注 0票数 13

我正在尝试使用visual 2005构建一个C/C++静态库。由于选择运行时库是一种编译选项,所以我不得不构建我的库的四个变体,其中一个针对运行时库的每个变种:

  • /MT -静态运行库
  • /MD - DLL运行库
  • /MTd -调试静态运行库
  • /MDd -调试DLL运行库

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-02-07 03:53:41

zdan提到的C预处理定义(如_DLL_DEBUG )的一个副作用是:

在调试运行时,某些数据结构(如STL容器和迭代器)可能因_HAS_ITERATOR_DEBUGGING_SECURE_SCL等特性而不同大小。您必须用与链接到的库兼容的结构定义编译代码。

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

代码语言:javascript
复制
warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs
票数 7
EN

Stack Overflow用户

发布于 2009-02-06 22:04:49

这些选项可以添加在运行库头文件中使用的定义(例如__DLL和__DEBUG )。需要做的一件常见事情是在动态链接时将__declspec(dllimport)添加到函数声明中。

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

票数 8
EN

Stack Overflow用户

发布于 2009-02-07 00:59:48

编译器需要知道您是在生成单线程代码还是多线程代码。默认情况下,编译器生成线程安全代码(多线程)。您必须告诉它,如果您想要单线程code.If,则更改默认的编译器更改默认的运行时库(您可以始终在链接器命令选项中覆盖这一点,只需确保您选择的库具有与您的对象文件相同的代码结构:单线程静态、多线程静态或多线程DLL)。注意,没有单线程DLL选项(根据定义,运行时库DLL将被构建为线程安全,因为它被多个应用程序共享)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/521972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档