代码之家  ›  专栏  ›  技术社区  ›  shoosh

正在解决lnk4098:defaultlib“msvcrt”与冲突

  •  184
  • shoosh  · 技术社区  · 15 年前

    这个警告:

    LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts
      with use of other libs; use /NODEFAULTLIB:library
    

    是Visual Studio中相当常见的警告。我想知道它的确切原因和正确的处理方法(如果有的话)。

    这是在调试生成中出现的,编译时使用 /MDd . 该项目链接到类似Windows的内容 Version.dll pdh.dll 他们自己联系的 MSVCRT.dll . 显然,我没有这些的调试版本,无法编译它们。

    所以我补充说 /NODEFAULTLIB:MSVCRT 到链接器命令行,它实际上删除了警告。但这实际上是做什么的呢?为什么有必要?

    5 回复  |  直到 7 年前
        1
  •  242
  •   Hans Passant    9 年前

    vc\lib中有4个版本的crt链接库:

    • libcmt.lib:发布版本的静态crt链接库(/mt)
    • libcmtd.lib:调试版本的静态crt链接库(/mtd)
    • msvcrt.lib:为CRT的发布dll版本导入库(/md)
    • msvcrtd.lib:为CRT的调试dll版本导入库(/mdd)

    查看链接器选项、项目+属性、链接器和命令行。请注意,这里没有提到这些库。链接器自动找出编译器使用了什么/M开关,以及应该通过pragma comment指令链接哪个.lib。有点重要的是,如果与/m选项和链接的.lib不匹配,则会出现可怕的链接错误,并且很难诊断运行时错误。

    当链接器被告知链接到msvcrt.lib时,您将看到引用的错误消息。 LIPCMT.LIB。如果您将用/mt编译的代码与用/md链接的代码链接起来,就会发生这种情况。CRT只能有一个版本。

    /nodefaultlib告诉链接器忽略从/mt编译代码生成的pragma comment指令。这可能有效,尽管大量其他链接器错误并不少见。诸如此类 埃尔诺 它是静态CRT版本中的一个外部int,但在DLL版本中被宏化为一个函数。其他很多人都喜欢。

    好吧,用正确的方法解决这个问题,找到你链接的.obj或.lib文件,它是用错误的/m选项编译的。如果您没有线索,那么您可以通过为/mt对.obj/.lib文件进行grepping来找到它。

    顺便说一句:Windows可执行文件(如version.dll)有自己的CRT版本来完成它们的工作。它位于C:\windows\system32中,您不能将其可靠地用于自己的程序,它的CRT头在任何地方都不可用。您的程序使用的CRT DLL具有不同的名称(如msvcrt90.dll)。

        2
  •  42
  •   Bridge user2173966    10 年前

    这意味着其中一个依赖DLL是用另一个 run-time library .

    Project & Gt;Projks& Gt:C/C++&G.代码生成-gt;运行时库

    浏览所有的库,看看它们是以相同的方式编译的。

    有关此链接中此错误的详细信息:

    warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs

        3
  •  28
  •   Evgen    8 年前

    依我所见 this link Yochai Timmer 很好,很相关,但读起来很痛苦。我写了一个总结。

    Yochai,如果你读过这封信,请看信尾。


    对于原始邮件,请阅读: warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs

    误差

    链接:警告lnk4098:defaultlib“libcd”与其他libs的使用冲突;使用/nodefaultlib:library

    意义

    系统的一部分被编译为使用带有静态链接的调试信息(libcd)的单线程标准(libc)库。

    而系统的另一部分被编译为使用多线程标准库,而不使用驻留在dll中并使用动态链接的调试信息。

    如何解决

    • 忽略警告,毕竟它只是一个警告。但是,您的程序现在包含相同函数的多个实例。

    • 使用链接器选项/nodefaultlib:lib。这不是一个完整的解决方案,即使您可以让程序以这种方式链接,您也忽略了一个警告标志:代码是为不同的环境编译的,您的某些代码可能是为单线程模型编译的,而其他代码是多线程的。

    • […]浏览所有库并确保它们具有正确的链接设置

    在后一种情况下,正如原员额所述,可能会出现两个常见问题:

    • 您有一个与应用程序链接不同的第三方库。

    • 代码中嵌入了其他指令:通常这是MFC。如果系统中的任何模块链接到MFC,则所有模块名义上都必须链接到同一版本的MFC。

    对于这些情况,确保您了解问题并在解决方案中作出决定。


    注:我想把Yochai Timmer链接的摘要包括在他自己的答案中,但是由于有些人很难正确地审查编辑内容,我不得不将其写在单独的答案中。对不起的

        4
  •  6
  •   user1016736    13 年前

    每次我想用VC++创建一个应用程序时都会得到这个消息。

    右键单击项目,选择属性,然后在“配置属性c/c++代码生成”下,选择“多线程调试(/MTD)”用于调试配置。

    请注意,这不会更改发布配置的设置-您需要转到同一位置并选择“多线程(/mt)”进行发布。

        5
  •  2
  •   raehee    8 年前

    右键单击项目,选择“属性”,然后在“配置属性”链接器输入忽略特定库下,写入msvcrtd.lib。