“ RuntimeLibrary”检测到不匹配

我下载并提取了 C: cryptopp 中的 Crypto + + 。我使用 VisualStudioExpress2012在其中构建了所有项目(如自述文件中所指示的那样) ,并且所有内容都成功构建。然后,我在其他一些文件夹中制作了一个测试项目,并添加了密码库作为一个依赖项。之后,我添加了 include 路径,这样就可以轻松地包含所有的标题。当我尝试编译时,我得到一个关于未解析符号的错误。

为了解决这个问题,我添加了 C:\cryptopp\Win32\Output\Debug\cryptlib.lib来链接其他依赖项。现在我得到了这个错误:

Error   1   error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj    C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(cryptlib.obj)    CryptoTest
Error   2   error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj    C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(iterhash.obj)    CryptoTest
Error   3   error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj    C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(sha.obj) CryptoTest
Error   4   error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj    C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(pch.obj) CryptoTest
Error   5   error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj    C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(misc.obj)    CryptoTest
Error   6   error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj    C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(queue.obj)   CryptoTest
Error   7   error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj    C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(algparam.obj)    CryptoTest
Error   8   error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj    C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(filters.obj) CryptoTest
Error   9   error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj    C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(fips140.obj) CryptoTest
Error   10  error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj    C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(cpu.obj) CryptoTest
Error   11  error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj    C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(mqueue.obj)  CryptoTest

我还得到:

Error   12  error LNK2005: "public: __thiscall std::_Container_base12::_Container_base12(void)" (??0_Container_base12@std@@QAE@XZ) already defined in cryptlib.lib(cryptlib.obj)    C:\Data\Work\C++ VS\CryptoTest\CryptoTest\msvcprtd.lib(MSVCP110D.dll)   CryptoTest
Error   13  error LNK2005: "public: __thiscall std::_Container_base12::~_Container_base12(void)" (??1_Container_base12@std@@QAE@XZ) already defined in cryptlib.lib(cryptlib.obj)   C:\Data\Work\C++ VS\CryptoTest\CryptoTest\msvcprtd.lib(MSVCP110D.dll)   CryptoTest
Error   14  error LNK2005: "public: void __thiscall std::_Container_base12::_Orphan_all(void)" (?_Orphan_all@_Container_base12@std@@QAEXXZ) already defined in cryptlib.lib(cryptlib.obj)   C:\Data\Work\C++ VS\CryptoTest\CryptoTest\msvcprtd.lib(MSVCP110D.dll)   CryptoTest
Error   15  error LNK2005: "public: __thiscall std::locale::id::id(unsigned int)" (??0id@locale@std@@QAE@I@Z) already defined in cryptlib.lib(iterhash.obj) C:\Data\Work\C++ VS\CryptoTest\CryptoTest\msvcprtd.lib(MSVCP110D.dll)   CryptoTest
Warning 16  warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library   C:\Data\Work\C++ VS\CryptoTest\CryptoTest\LINK  CryptoTest
Error   17  error LNK1169: one or more multiply defined symbols found   C:\Data\Work\C++ VS\CryptoTest\Debug\CryptoTest.exe 1   1   CryptoTest

我尝试编译的代码很简单(这是从另一个站点得到的) :

#include <iostream>
#include <string>
#include "sha.h"
#include "hex.h"
using namespace std;


string SHA256(string data) {
byte const* pbData = (byte*) data.data();
unsigned int nDataLen = data.size();
byte abDigest[32];


CryptoPP::SHA256().CalculateDigest(abDigest, pbData, nDataLen);


return string((char*)abDigest);
}


int main(void) {


return 0;
}

- 有办法解决吗?-我现在只需要 SHA-256没别的了。 我使用的是 Windows764位,我今天下载了 VSC + + ,所以它应该是最新的版本。

147590 次浏览

(这个问题已经在评论中得到了回答,但是因为它缺少一个实际的 回答,所以我写了这篇文章。)

这个问题出现在 Visual C + + 的新版本中(旧版本通常只是静默地链接程序,它会在运行时崩溃和烧毁)这意味着与程序链接的一些库(甚至程序内部的一些源文件)是 使用不同版本的 CRT (C RunTime 库)

为了纠正这个错误,你需要进入你的 Project Properties(和/或那些你正在使用的库) ,然后进入 C/C++,然后 Code Generation,并检查 Runtime Library的值; 这应该是完全相同的 所有的文件和库,你链接在一起。(链接 DLL 的规则稍微宽松一些,但我不打算在这里讨论“为什么”和更多细节。)

目前有四种选择:

  1. 多线程调试
  2. 多线程调试 DLL
  3. 多线程发布
  4. 多线程发布 DLL

你的特殊问题似乎源于你将用“多线程调试”(即静态多线程调试 CRT)构建的库与使用“多线程调试 DLL”设置(即动态多线程调试 CRT)构建的程序联系起来您应该在库或程序中更改此设置。现在,我建议在您的程序中改变这一点。

请注意,由于 VisualStudio 项目使用不同的项目设置来进行调试和发布构建(以及32/64位构建) ,因此应确保所有这些项目配置中的设置都匹配。

更多信息,你可以看到以下内容(链接自上面的评论) :

  1. MSDN 上的链接器工具警告 LNK4098
  2. MSDN 上的/MD、/ML、/MT、/LD (使用运行时库)
  3. 使用 VC11 Beta 版本构建错误-使用 MDd exx 的 MTd 库无法链接 Bugzilla@Mozilla 上的

更新 : (这是对一条评论的回应,该评论询问为什么必须如此小心。)

如果我们链接在一起的两段代码本身就是标准库的链接和使用者,那么对于这两段代码,标准库必须是相同的,除非 很好注意到我们的两段代码是如何交互和传递数据的。一般来说,对于几乎所有的情况,我会说只是使用标准库运行时的完全相同的版本(关于调试/发布,线程,当然还有 Visual C + + 的版本,以及其他事情,比如迭代器调试,等等)

这个问题最重要的部分是: 对函数调用两边的对象的大小有相同的想法

例如,考虑以上两段代码分别称为 AB。A 是 编译完毕对应标准库的一个版本,B 对应另一个版本。在 A 看来,一个标准函数返回给它的一些随机对象(例如一块内存或者一个迭代器或者一个 FILE对象或者别的什么)有一些特定的大小和布局(记住结构布局是在 C/C + + 的编译时确定和固定的)由于某些原因,B 对同一对象的大小/布局的想法是不同的(这可能是由于额外的调试信息、数据结构随时间的自然演变等原因)

现在,如果 A 调用标准库并返回一个对象,然后将该对象传递给 B,而 B 以任何方式接触该对象,那么很可能 B 会把该对象搞乱(例如写错字段,或者过了该字段的末尾,等等)

可能发生的问题不仅仅是以上这些。标准库中的内部全局对象或静态对象也可能导致问题。而且还有更多模糊的问题类别。

当使用 DLL (动态运行时库)而不是 libs (静态运行时库)时,所有这些在某些方面变得更加怪异

这种情况可以适用于两段代码共同使用的任何库,但是标准库被大多数(如果不是几乎所有)程序使用,这增加了冲突的可能性。

我所描述的显然是一个实际混乱的简化版本,如果你混合库版本等待你。我希望它能让你明白为什么你不应该这么做!

我下载并提取了 C: cryptopp 中的 Crypto + + 。我使用 VisualStudioExpress2012在其中构建了所有项目(如自述文件中所指示的那样) ,并且所有内容都成功构建。然后,我在其他一些文件夹中制作了一个测试项目,并添加了密码库作为一个依赖项。

转换可能不成功。唯一成功的事情是运行 VCUpgrade。实际的转换本身失败了,但是直到您经历了所看到的错误之后才知道。有关详细信息,请参阅 Crypto + + wiki 上的 视觉工作室


有办法解决吗?

为了解决你的问题,如果你想要静态 C/C + + 运行时链接(/MT/MTd) ,你应该下载 vs2010.zip; 如果你想要动态 C/C + + 运行时链接(/MT/MTd) ,你应该下载 vs2010-dynamic.zip。两者都修复了由 VCUpgrade 产生的潜在的、无声的失败。


vs2010.zip vs2010-dynamic.zipvs2005-dynamic.zip是由 最新的 GitHub 资源构成的。在撰写本文时(JUN 12016) ,这实际上是在 Crypto + + 5.6.4之前。如果使用具有下级 Crypto + + 的 ZIP 文件,比如5.6.2或5.6.3,那么会遇到一些小问题。

我注意到有两个小问题。第一个是 ABC0呼叫 bench1.cpp的重命名。它的错误是:

  • C1083: Cannot open source file: 'bench1.cpp': No such file or directory
  • LNK2001: unresolved external symbol "void __cdecl OutputResultOperations(char const *,char const *,bool,unsigned long,double)" (?OutputResultOperations@@YAXPBD0_NKN@Z)

解决方法是(1)在记事本中打开 cryptest.vcxproj,找到 bench1.cpp,然后将其重命名为 bench.cpp。或者(2)在文件系统上将 bench.cpp重命名为 bench1.cpp。请不要删除这个文件。

第二个问题有点棘手,因为它是一个移动的目标。低级版本,比如5.6.2或5.6.3,缺少了 GitHub中可用的最新类。遗失的类别档案包括 HKDF (5.6.3)、 RDRAND (5.6.3)、 RDSEED (5.6.3)、 ChaCha (5.6.4)、 BLAKE2(5.6.4)、 Poly1305(5.6.4)等。

修复方法是从 VisualStudio 项目文件中删除缺少的源文件,因为它们不存在于向下级别的发行版中。

另一种选择是从最新的源添加缺少的类文件,但是可能会有并发症。例如,许多源微妙地依赖于最新的 config.hcpu.hcpu.cpp。“微妙之处”在于,你不会意识到自己得到的是一个表现不佳的班级。

表现不佳的类的一个例子是 BLAKE2。config.h增加了 ARM-32和 ARM-64检测的编译时间。cpu.hcpu.cpp增加了运行时 ARM 指令检测,这取决于编译时检测。如果在添加 BLAKE2时没有添加其他文件,那么就不会发生任何检测,而是得到一个直接的 C/C + + 实现。您可能没有意识到您正在错过 NEON 的机会,它每字节运行大约9到12个周期,而普通的 C/C + + 运行大约为每字节40个周期。

我有这个问题,以及在迭代器 _ DEBUG _ LEVEL 中的不匹配。 作为一个星期天晚上的问题,毕竟似乎可以和好去,我出去了一段时间。 在 de VS2017 IDE (解决方案资源管理器)中工作,我最近从另一个项目中添加/复制了一个源文件引用到我的项目(ctrl-drag)。查看属性-> C/C + +/预处理器-在源文件级别,而不是项目级别-我注意到在一个发布配置中为这个源文件指定了 _ DEBUG 而不是 NDEBUG。 这就是摆脱这个问题所需要的全部改变。

问题可以通过在链接器库中添加 msvcrtd.lib 的 CRT 来解决。 因为 cryptlib.lib 使用了调试的 CRT 版本。