【问题标题】:Runtime Library mis-matches and VC++ - Oh, the misery!运行时库不匹配和 VC++ - 哦,痛苦!
【发布时间】:2011-01-22 12:53:56
【问题描述】:

似乎我整个成年生活都被 VC++ 链接器抱怨或犹豫所折磨,因为各种库不同意使用哪个版本的运行时库。我从来没有心情去掌握那个令人沮丧的主题。所以我只是试着弄乱它,直到它起作用。错误消息永远不会有用。微软关于这个主题的文档也不是——至少对我来说不是。

有时它找不到函数 - 因为名称修改不是预期的?有时它拒绝混搭。其他时候它只是说,“LINK : warning LNK4098: defaultlib 'LIBCMTD' conflict with use of other libs; use /NODEFAULTLIB:library” 使用 /NODEFAULTLIB 不起作用,但警告似乎是良性的.到底什么是“DEFAULTLIB”?链接器如何决定?我从来没有见过一种方法来指定链接器使用哪个运行时库,只知道如何告诉编译器为哪个库创建函数调用。

有一些“dependency walker”程序可以检查目标文件以查看它们所依赖的 DLL。我刚刚在我正在尝试构建的项目上运行了一个,这真是一团糟。有些系统 .libs 和 .dll 需要冲突的运行时版本。例如,COMCTL32.DLL 想要 MSVCRT.DLL,但我链接的是 MSVCRTD.DLL。我正在搜索是否有 COMCTL32D.DLL,即使在我键入时也是如此。

所以我想我要的是一个关于如何整理这些东西的教程。你是做什么的,你是怎么做的?

这是我认为我知道的。如有错误请指正。

  1. 参数为调试/发布、多线程/单线程和静态/DLL。仅涵盖八种可能组合中的六种。没有单线程 DLL,无论是 Debug 还是 Release。

  2. 这些设置只影响链接到哪个运行时库(以及与之链接的调用约定)。例如,如果您正在构建 DLL,则不必使用基于 DLL 的运行时,也不必在构建程序的 Debug 版本时使用 Debug 版本的运行时,尽管在单跳过系统调用。

额外问题:任何人或任何公司怎么会造成这样的混乱?

【问题讨论】:

    标签: visual-c++ runtime msvcrt libc


    【解决方案1】:

    您的观点 (1) 和 (2) 在我看来是正确的。 (2) 需要注意的另一件事是,调试 CRT 中的链接还使您可以访问诸如增强的堆检查、检查的迭代器和其他各种健全性检查之类的东西。但是,您不能将调试 CRT 与您的应用程序一起重新分发——您必须仅使用发布版本发布。它不仅是 VC 许可证所要求的,而且您可能也不想发布调试二进制文件。

    没有COMCTL32D.DLL 这样的东西。作为 Windows 一部分的 DLL 必须加载它们在构建 Windows 时链接的 CRT——这在操作系统中包含为 MSVCRT.DLL。此 Windows CRT 完全独立于由构成程序的模块加载的 Visual C++ CRT(MSVCRT.DLL 是 Windows 附带的。VC CRT 将包含一个版本号,例如 MSVCRT80.DLL)。只有构成您的程序的 EXE 和 DLL 文件受调试/发布多线程/单线程设置的影响。

    IMO 的最佳做法是为您的 CRT 选择一个设置,并为您发布的每个二进制文件对其进行标准化。我个人会使用多线程 DLL 运行时。这是因为 Microsoft 可以(并且确实)向 CRT 发布可通过 Windows Update 推出的安全更新和错误修复。

    【讨论】:

    • 太棒了!我想我明白,但当我不可避免地发现我不明白时,保留提问的权利。顺便说一句,在我现在正在处理的项目中,我正在让 Release 和 Debug 都链接并运行,但 Release 版本告诉我,“LINK:警告 LNK4098:defaultlib 'LIBCMT' 与使用其他库发生冲突;使用/NODEFAULTLIB:图书馆。”这让我很困惑,因为我选择了多线程 DLL 进行代码生成 (/MD)。调试版本链接干净。我正在与 wxWidgets、lcms、opencv 以及其他任何吸引进来的东西链接。在迷雾中前进!
    • 我发现了如何在 VC++ IDE 中有效地“使用 /NODEFAULTLIB:libray”。调出“属性”,然后调出“链接器/输入”页面。将有问题的 DEFAULTLIB 的名称放入文本框中“忽略特定库”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2012-02-21
    相关资源
    最近更新 更多