链接 : 警告 LNK4098: 默认库 'MSVCRT' 与其他库的使用冲突;使用 /NODEFAULTLIB:Library

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

本文关键字:冲突 使用 Library NODEFAULTLIB MSVCRT LNK4098 警告 默认 链接 其他      更新时间:2023-10-16

当我尝试构建与libeay32.lib链接的源代码时。我已经从OpenSSL源代码本地构建了它。我遇到了上面的警告"LINK:warning LNK4098:defaultlib'MSVCRT'与其他库的使用冲突;使用/NODEFAULTLIB:library"。当我调试exe时,只要有一些系统调用(如read()),exe就会崩溃。经过一番搜索,我发现这是与"运行库"MT和MD有关的东西。由于某些原因,我无法通过构建openssl源代码来解决这个问题。到目前为止,我所做的是将条目"MSVCRT.lib"保留在忽略特定库中。我必须为其他几个库执行此操作。我不想这么做。还有其他最优解决方案吗。

如果我理解得对,你将OpenSSL的发布版本与程序的调试版本混合在一起,导致使用不同的CRT版本,因为你还没有发布实际设置,所以更糟糕的是,OpenSSL在你的代码静态时使用DLL CRT。请张贴您的程序使用的CRT是什么类型的(可以通过单击项目上的Properties,然后单击Configuration Properties -> C/C++ -> Code Generation -> Runtime Libarary找到)。使用正确的OpenSSL版本(例如,使用调试信息构建并链接到调试CRT),或者,由于您声明无法重新编译OpenSSL,因此在没有优化的情况下使用Multi-threaded DLL版本编译代码,这样您就可以得到一个可以调试的程序,并使用与OpenSSL相同的CRT。我想这应该能解决问题。

Visual Studio编译器在构建时有两种模式:多线程和非多线程。您可以在创建项目时设置模式,以后可以在项目设置中对其进行更改。

这里的问题是这两种模式不兼容。如果混合使用多线程库和非多线程库,则会出现类似的错误。使用其他模式重新编译其他库,或者更改项目的模式以匹配库的模式。

当使用不同风格的Microsoft C-Runtime库时,会出现此冲突。以下是概述:http://msdn.microsoft.com/en-us/library/abx4dbyh.aspx

因此,如果你链接到msvcrt.lib(动态,多线程CRT),并且你的一个依赖项链接到libcmtd.lib(静态,多线程),就会出现这个警告。这种情况可能会导致细微的错误,并可能导致各种难以调试的问题。除了将冲突库设置为"忽略"列表,如果无法控制依赖关系,则希望一切都好之外,没有什么可以摆脱警告的了。通常,对所有依赖项和程序本身使用相同的C/C++运行时链接是个好主意。

问题是,您正在将应用程序动态链接到VS中的运行时/MD(默认情况下,这意味着您应该在应用程序中提供Visual Studio Redistributable Package)。

属性->配置属性->C/C++->代码生成->运行库

而opensll-lib默认静态链接到运行时(运行时包含例如STL的实现)。混合运行时链接是不好的,因此是警告。您可以通过使用到运行时的动态链接重新编译opensll库来解决此问题。

请遵守:http://developer.covenanteyes.com/building-openssl-for-visual-studio/然后在中

ms\nt.mak

在运行nmake -f msnt.maknmake -f msnt.mak install 之前将MT更改为MD