【问题标题】:Linker warning C++ Visual Studio链接器警告 C++ Visual Studio
【发布时间】:2010-11-26 18:09:51
【问题描述】:

我遇到了这个问题,虽然这是一个警告,但我怀疑是引擎盖下有问题的迹象。当我在发布模式下构建时,我收到以下警告:

MSVCRT.lib(cinitexe.obj):警告 LNK4098:defaultlib 'msvcrtd.lib' 与其他库的使用冲突;使用 /NODEFAULTLIB:library

我正在Visual Studio C++ Express Edition 中构建一个动态 DLL。当我在调试模式下执行此操作时,不会出现警告。我用谷歌搜索了一下,看起来msvcrtmsvcrtd 都用于多线程,一个用于调试,另一个不是。我可以将/NODEFAULTLIBMSVCRT.lib 一起使用,但我不认为避免症状真的有助于解决问题。

我真的不知道这是否是一个大问题。 DLL 和.lib 文件已正确生成。

【问题讨论】:

  • 发布版本应该只包含msvcrt.lib而不是msvcrtd.lib。你确定你没有加错东西吗?
  • 我看到你是新来的。如果以下任何答案有助于解决您的问题,请将答案标记为“已接受”。 :)

标签: visual-c++


【解决方案1】:

检查您的运行时库设置在项目的发布配置中是否正确。基本上它应该与您的调试版本相同,但在描述中没有“调试”一词。有关此问题的 Visual Studio 文档是 here

检查您的设置如下:

  • 在解决方案资源管理器中右键单击项目并选择属性
  • 确保配置(在属性窗口顶部)为Active (Release)
  • 转到配置属性 -> C/C++ -> 代码生成
  • 检查 Runtime Library for Release 不是 CRT 的 Debug 版本。

【讨论】:

    【解决方案2】:

    问题与您的库有关。 它们的链接方式与您的程序不同。

    例如,您的程序可能是单线程的,而您的库可能是多线程的。

    往下看

    Project Properties 
    Configuration Properties
    C/C++ 
    Code Generation 
    Runtime Library
    

    查看设置(例如“多线程调试 DLL (/MDd)”)。

    【讨论】:

      【解决方案3】:

      这是一个大问题,因为它可能导致您的应用程序发生许多意外崩溃,并且您不能分发链接msvcrtd.lib 的应用程序,因为您不允许分发 Visual Studio 的调试 C++ 运行时。 虽然/NODEFAULTLIB 应该解决这些问题,但您应该自己解决问题。

      就像 casablanca 所说,msvcrtd.lib 在发布模式下链接,但它应该只在调试模式下链接。 这并不意味着您自己的应用程序有错误的链接器设置。您在项目中使用的任何库也可能有不正确的设置。

      我通常会解决这个问题,使用可以打开如此大的二进制文件(如SciTE)的文本编辑器打开您的应用程序链接的所有发行版.lib文件,然后我搜索它们例如VC80.DebugCRT(在这种情况下为 VC80 == Visual Studio 2005),如果我在其中一个库中找到此字符串,则应使用 /MD 重新编译该库。

      如果您要链接动态库,您可以在.dll 文件上使用名为Dependency Walker 的工具,而不是手动搜索.lib 文件。 如果 Dependency Walker 显示对调试 crt DLL 文件之一的依赖关系,例如MSVCP80D.dll(注意尾随的 D),使用 /MD 重新编译该库。

      【讨论】:

        猜你喜欢
        • 2011-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-21
        • 1970-01-01
        • 2018-12-05
        相关资源
        最近更新 更多