编译cryptopp时MT/MD不匹配,尽管没有库依赖项

MT / MD mismatch when compiling cryptopp despite no library dependencies

本文关键字:依赖 cryptopp MT 不匹配 MD 编译      更新时间:2023-10-16

我目前正试图在Windows 8.1计算机上使用MS Visual Studio 2013编译cryptopp的静态64位版本(更准确地说,是cryptlib VS项目)。由于它是一个静态版本构建,我已经将Runtime Library设置为Multithreaded(/MT)。

但是,链接器会抛出以下几个错误:

error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in adhoc.obj

在我在这里和谷歌上发现的大多数类似情况下,这是由一个库设置/MT和另一个库的设置/MD引起的。这种情况的奇怪之处在于,链接器不包括任何库(除了Visual Studio内部的一些魔术),也没有额外的包含目录。链接器命令行组合为:

/OUT:"buildx64static_releasecryptlib64.lib" /LTCG /MACHINE:X64 /NOLOGO

在项目文件中,我找不到任何其他<运行时库>除了那些在项目级别上的设置,所以我认为没有.cpp文件具有/MD开关。

总之,这意味着我的库定义了/MT,但crytlib内部使用的东西似乎定义了/MD。有没有一种方法可以找出这个开关定义了什么对象/cpp/define/library/什么?

此链接器诊断是一个100%准确的提示,表明您实际上正在链接构建错误的.obj或.lib文件。几乎总是你不知道的.lib文件,因为你不必显式地将它们列为附加依赖项。MSVC++使指定链接依赖关系变得非常容易,而无需使用设置,例如在源代码文件中使用添加引用或#pragma comment(lib, "yadayada.lib")。当然非常方便,但当您试图解决这样的链接器错误时,就不那么明显了。

它很容易诊断,但是,链接器可以选择向您显示它实际链接的内容。使用Project+Properties、Linker和Command Line,然后添加/VERBOSE选项。链接器现在可以非常方便地访问Output窗口,向您显示它加载的每个.lib文件以及它从.lib文件中使用的符号。

lib名称应该足以提示您从哪里开始查找,您应该从那里知道#include。你是否能用/MT构建真的还悬而未决,如果它是DLL的导入库,那么几率会迅速降低。避免强迫,在一个过程中有多个CRT副本是充满麻烦的。

清洁解决方案,然后重新构建可能会有所帮助。链接器似乎仍在尝试使用旧的对象文件(在您应用/MT之前)

这种情况的奇怪之处在于,链接器不包括任何库(除了一些Visual Studio内部的魔术)

如果你确信它不是你装备中的东西,那么它很有可能是从哪里来的。

如果您可以选择动态C++运行时链接,那么您可以考虑将其用于Crypto++。为了解决将Crypto++转换为Visual Studio 2010(及更高版本)以及转换为/MD/MDd的问题,可以使用vs2010-dynamic.zip。只需在现有Crypto++源的顶部打开它。


另请参阅堆栈溢出上检测到的"RuntimeLibrary"和Crypto++不匹配。