当我尝试构建与 libeay32.lib 链接的源时。我是从 OpenSSL 源本地构建的。我遇到了上述警告“链接:警告 LNK4098:defaultlib 'MSVCRT' 与使用其他库发生冲突;使用 /NODEFAULTLIB:library”。当我调试我的 exe 时,只要有一些系统调用(如 read()),Exe 就会崩溃。经过一番搜索,我发现这是与“运行时库”MT 和 MD 相关的东西。由于某些原因,我无法通过构建 openssl 源来解决此问题。到目前为止,我所做的是在忽略特定库中保留条目“MSVCRT.lib”,我必须为其他几个库执行此操作。我不想这样做。是否有任何其他最佳解决方案。
4 回答
如果我理解正确,您将 OpenSSL 的发布版本与您的程序的调试版本混合,导致使用不同的 CRT 版本,因为您没有发布实际设置,OpenSSL 使用 DLL CRT 可能更糟糕,而您代码静态。请发布您的程序使用的是哪种 CRT(可以通过单击Properties
项目然后找到Configuration Properties -> C/C++ -> Code Generation -> Runtime Libarary
)。要么使用正确的 OpenSSL 版本(例如,使用调试信息构建它并链接到调试 CRT),要么,因为你说你不能重新编译 OpenSSL,Multi-threaded DLL
所以在没有优化的情况下编译你的代码,这样你就得到一个可以调试并使用相同的程序CRT 作为 OpenSSL。我猜这应该可以解决它。
Visual Studio 编译器在构建时有两种模式:多线程和非多线程。您在创建项目时设置模式,稍后可以在项目设置中更改它。
这里的问题是这两种模式不兼容。如果您混合使用多线程库和非多线程库,那么您会遇到类似的错误。使用其他模式重新编译其他库,或者更改项目的模式以匹配库的模式。
问题是您将应用程序动态链接到 VS 中的运行时 /MD(默认情况下,这意味着您应该为您的应用程序提供 Visual Studio Redistributable Package)。
属性 -> 配置属性 -> C/C++ -> 代码生成 -> 运行时库
而默认情况下,opensll 库静态链接到运行时(运行时包含例如 STL 的实现)。混合运行时链接因此警告是不好的。您可以通过使用运行时的动态链接重新编译 opensll 库来解决此问题。
请关注:http: //developer.covenanteyes.com/building-openssl-for-visual-studio/ 然后在
ms\nt.mak
在运行之前更改\MT
为\MD
nmake -f ms\nt.mak
nmake -f ms\nt.mak install
使用不同风格的 Microsoft C-Runtime 库时会出现这种冲突。这是一个概述:http: //msdn.microsoft.com/en-us/library/abx4dbyh.aspx
因此,如果您链接到 msvcrt.lib(动态、多线程 CRT)并且您的依赖项之一与 libcmtd.lib(静态、多线程)相关联,则会出现此警告。这种情况可能会导致细微的错误,并可能导致各种难以调试的问题。除了将冲突的库设置为忽略列表并希望在您无法控制依赖关系时获得最好的结果之外,您无能为力摆脱警告。一般来说,对所有依赖项和程序本身使用相同的 C/C++ 运行时链接是一个好主意。