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

时间:2015-02-10 08:56:07

标签: c++ visual-c++ visual-studio-2013 linker-errors crypto++

我目前正在尝试使用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

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

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

在项目文件中,我找不到任何其他< RuntimeLibrary>设置除了项目级别的设置,所以我假设没有.cpp文件有/ MD开关。

总而言之,这意味着我的库定义了/ MT,但内部使用的crytlib似乎已经定义了/ MD。有没有办法找出什么对象/ cpp / define / library /有什么交换机定义?

3 个答案:

答案 0 :(得分:3)

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

它易于诊断,但链接器可以选择显示它实际链接的内容。使用Project + Properties,Linker,Command Line并添加/VERBOSE选项。链接器现在非常适合输出窗口,向您显示它加载的每个.lib文件以及它从.lib文件中使用的符号。

.lib名称应该足以知道从哪里开始查找,你应该从那里知道#include。无论你是否真的使用/ MT构建仍然悬而未决,如果它是DLL的导入库,那么可能性很快就会减少。避免强迫它,在一个过程中有一个以上的CRT副本充满了麻烦。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

  

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

很有可能它来自于你认为它不是你装备中的东西。

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

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