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