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

MT / MD mismatch when compiling cryptopp despite no library dependencies

我目前正在尝试在 Windows 8.1 机器上使用 MS Visual Studio 2013 编译静态 64 位版本的 cryptopp(更准确地说,cryptlib VS 项目)。由于它是静态发布版本,我已将运行时库设置为多线程 (/MT)。

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

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

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

/OUT:"build\x64\static_release\cryptlib64.lib" /LTCG /MACHINE:X64 /NOLOGO

在项目文件中,除了项目级别的设置外,我找不到任何其他 设置,因此我假设没有带有 /MD 开关的 .cpp 文件。

总而言之,这意味着我的库定义了 /MT,但 crytlib 内部使用的东西似乎定义了 /MD。有没有办法找出 object/cpp/define/library/whatever 定义了那个开关?

清理解决方案然后重建可能会有帮助。链接器似乎仍在尝试使用旧的目标文件(在您应用 /MT 之前)。

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

它很容易诊断,但是,linker 有一个选项可以向您展示它实际上是什么 linking。使用 Project + Properties、Linker、Command Line 并添加 /VERBOSE 选项。 linker 现在对输出 window 非常健谈,向您展示它加载的每个 .lib 文件以及它使用的 .lib 文件中的符号。

.lib 名称应该足以让您知道从哪里开始查找,您应该从那里知道#include。您是否可以 真的 使用 /MT 构建仍然悬而未决,如果它是 DLL 的导入库,那么可能性会迅速降低。避免强求,在一个进程中拥有多个 CRT 副本是很麻烦的。

The weird thing about this case is that the linker does not include any libraries (except maybe some Visual-Studio-internal magic)

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

如果动态 C++ 运行时链接适合您,那么您可以考虑将其用于 Crypto++。为了减轻将 Crypto++ 转换为 Visual Studio 2010(及更高版本)和转换为 /MD/MDd 的麻烦,您可以使用 vs2010-dynamic.zip。只需将其解压到现有的 Crypto++ 源之上即可。


另请参阅 Stack Overflow 上的 Mismatch Detected for 'RuntimeLibrary' and Crypto++