【发布时间】:2013-10-06 18:27:43
【问题描述】:
对于在 Linux 和 Windows 上构建的跨平台软件项目,我们有不同的方法来处理第三方库。在 Linux 上,我们构建并链接与 CentOS/RHEL 发行版一起分发的版本,这意味着我们链接到发布版本,而在 Windows 上,我们维护自己的第三方库“包”,在 Windows 上,我们为每个库构建两个版本 -链接 msvcr100 和 msvcp100 的发布版本和链接 msvcr100d 和 msvcp100d 的调试版本。
我的问题只是是否需要在 Windows 上构建第三方依赖项的调试版本,或者我们在构建我们自己的软件的调试版本时是否可以简单地使用 /nodefaultlib:msvcr100。
一个后续问题:我在哪里可以了解这方面的良好做法。我已经阅读了有关 msvc 运行时的 MSDN 页面,但是关于建议的内容很少。
编辑:
让我更简洁地重新表述这个问题。在 VS2010 中,使用 /nodefaultlib:msvcr100 将可执行构建与 /MDd 链接时,与使用 /MD 编译的库链接有什么问题。
我这样做的动机是避免构建我使用的第三方库的发布版本和调试版本。我还希望我的调试版本运行得更快。
来自 /MD、/MT、/LD(使用运行时库)的文档:
MD: 使您的应用程序使用运行时库的多线程和 DLL 特定版本。定义 _MT 和 _DLL 并使编译器将库名称 MSVCRT.lib 放入 .obj 文件中。
使用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供了一层代码,允许链接器解析外部引用。实际工作代码包含在 MSVCR100.DLL 中,必须在运行时对与 MSVCRT.lib 链接的应用程序可用
/MDd: 定义 _DEBUG、_MT 和 _DLL 并使您的应用程序使用运行时库的调试多线程和 DLL 特定版本。它还会导致编译器将库名称 MSVCRTD.lib 放入 .obj 文件中。
因此,除了定义的 _DEBUG 之外,没有任何文档说明对生成的代码所做的任何差异。
【问题讨论】:
标签: visual-c++ runtime msvcrt