【问题标题】:Is /nodefaultlib:msvcr100 the proper approach to handling msvcr100.dll vs msvcr100d.dll defaultlib issue/nodefaultlib:msvcr100 是处理 msvcr100.dll 与 msvcr100d.dll defaultlib 问题的正确方法吗
【发布时间】: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


    【解决方案1】:

    您只能使用 CRT 的调试版本来调试您的应用。它包含许多断言来帮助您发现代码中的错误。您从不发布项目的调试版本,总是发布版本。你也不能,许可证禁止发送 msvcr100d.dll。因此,正确地构建您的项目会自动避免对 CRT 调试版本的依赖。

    /nodefaultlib 链接器选项旨在允许将您的程序与自定义 CRT 实现链接。非常少见,但有些程序员非常关心构建小程序,而标准 CRT 并不是那么小。

    一些程序员使用 /nodefaultlib 来解决链接问题。当他们将使用调试配置设置构建的代码与使用发布配置设置构建的代码链接时引发。或具有不兼容 CRT 选项的链接代码,/MD 与 /MT。这可以工作,不能保证,但当然只会扫除地板垫下的真正问题。

    所以不,这不是正确的选择,解决核心问题应该是你的目标。确保所有 .obj 和 .lib 文件都是使用相同的编译器选项构建的,这样就不会出现这个问题。如果这意味着您必须纠缠图书馆所有者以获得正确的构建,那么请先纠缠,只有当您发现您不想再依赖该 .lib 但还没有是时候寻找替代方案了。

    【讨论】:

    • 嗨,汉斯,感谢您的回答。这不是我正在寻找的东西,但我会为此承担责任。我的问题措辞不好。我会尽快更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多