检测到"运行时库"不匹配

Mismatch Detected for 'RuntimeLibrary'

本文关键字:不匹配 运行时 检测      更新时间:2023-10-16

我在C:\cryptopp中下载并提取了Crypto++。我使用 Visual Studio Express 2012 构建了里面的所有项目(按照自述文件中的说明(,一切都成功构建了。然后我在其他文件夹中创建了一个测试项目,并将 cryptolib 添加为依赖项。之后,我添加了包含路径,以便可以轻松包含所有标头。当我尝试编译时,我收到有关未解析符号的错误。

为了解决这个问题,我添加了C:cryptoppWin32OutputDebugcryptlib.lib来链接其他依赖项。现在我收到此错误:

Error   1   error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj    C:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestcryptlib.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:DataWorkC++ VSCryptoTestCryptoTestmsvcprtd.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:DataWorkC++ VSCryptoTestCryptoTestmsvcprtd.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:DataWorkC++ VSCryptoTestCryptoTestmsvcprtd.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:DataWorkC++ VSCryptoTestCryptoTestmsvcprtd.lib(MSVCP110D.dll)   CryptoTest
Warning 16  warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library   C:DataWorkC++ VSCryptoTestCryptoTestLINK  CryptoTest
Error   17  error LNK1169: one or more multiply defined symbols found   C:DataWorkC++ VSCryptoTestDebugCryptoTest.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,没有别的。我使用的是Windows 7 64位,今天下载了VS C++,所以它应该是最新版本。

(这已经在评论中回答了,但由于它缺乏实际答案,所以我正在写这个。

此问题出现在较新版本的Visual C++中(旧版本通常只是静默链接程序,它会在运行时崩溃和刻录。这意味着您与程序链接的某些库(甚至是程序本身中的某些源文件(正在使用不同版本的 CRT(C 运行时库(。

要纠正此错误,您需要进入Project Properties(和/或您正在使用的库(,然后进入C/C++,然后进入Code Generation,并检查Runtime Library的值;对于您链接在一起的所有文件和库,这应该是完全相同的。(与 DLL 链接的规则稍微宽松一些,但我不会在这里讨论"为什么"和更多详细信息。

此设置目前有四个选项:

  1. 多线程调试
  2. 多线程调试 DLL
  3. 多线程发布
  4. 多线程发布 DLL
您的特定问题似乎源于您将使用"多线程调试"(即静态多线程调试 CRT(

构建的库与使用"多线程调试 DLL">设置(即动态多线程调试 CRT(生成的程序相关联。应在库或程序中更改此设置。现在,我建议在您的程序中更改它。

请注意,由于 Visual Studio 项目对调试和发布版本(以及 32/64 位版本(使用不同的项目设置集,因此应确保所有这些项目配置中的设置都匹配。

有关(一些(更多信息,您可以看到以下内容(链接自上面的评论(:

  1. MSDN 上的链接器工具警告LNK4098
  2. MSDN 上的/MD,/ML,/MT,/LD (USE RUN-TIME LIBRARY(
  3. VC11 Beta 的构建错误 - 将 MTd 库与 MDd exe 混合无法在Bugzilla@Mozilla上链接

更新:(这是对评论的回应,该评论要求必须采取如此多的谨慎措施。

如果我们链接在一起的两段代码本身链接并使用标准库,那么它们的标准库必须相同,除非非常小心我们的两个代码段如何交互和传递数据。一般来说,我会说几乎所有情况都只是使用完全相同版本的标准库运行时(关于调试/发布、线程,显然还有 Visual C++ 的版本,以及其他内容,如迭代器调试等(。

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

例如,考虑上述两段代码称为AB。A 针对标准库的一个版本进行编译,B 针对另一个版本进行编译。在A的眼中,标准函数返回给它的一些随机对象(例如内存块或迭代器或FILE对象或其他什么(具有特定的大小和布局(请记住,结构布局是在C/C++编译时确定和固定的。出于以下几个原因中的任何一个,B对相同对象的大小/布局的想法是不同的(这可能是因为额外的调试信息,数据结构随时间的自然演变等(。

现在,如果 A 调用标准库并取回一个对象,然后将该对象传递给 B,并且 B 以任何方式触摸该对象,则 B 很可能会弄乱该对象(例如,写入错误的字段,或超过它的末尾等(。

以上并不是唯一可能发生的问题。标准库中的内部全局或静态对象也可能导致问题。还有更多晦涩难懂的问题类别。

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

这种情况可以应用于由两段协同工作的代码使用的任何库,但标准库被大多数(如果不是几乎所有(程序使用,这增加了冲突的机会。

我所描述的显然是混合库版本时等待您的实际混乱的淡化和简化版本。我希望它能让你知道为什么你不应该这样做!

我遇到了这个问题以及ITERATOR_DEBUG_LEVEL不匹配的问题。由于周日晚上的问题似乎还可以,而且很好,我被淘汰了一段时间。在de VS2017 IDE(解决方案资源管理器(中工作,我最近从另一个项目添加/复制了对我的项目的源文件引用(ctrl-drag(。在源文件级别而不是项目级别查看属性 ->C/C++/预处理器 - 我注意到在发布配置中指定了_DEBUG而不是此源文件的 NDEBUG。这就是摆脱问题所需的全部更改。

我在C:\cryptopp中下载并提取了Crypto++。我使用 Visual Studio Express 2012 构建了里面的所有项目(按照自述文件中的说明(,一切都成功构建了。然后我在其他文件夹中创建了一个测试项目,并将 cryptolib 添加为依赖项。

转换可能不成功。唯一成功的是VCUpgrade的运行。实际转换本身失败了,但直到您遇到看到的错误,您才知道。有关一些详细信息,请参阅 Crypto++ wiki 上的 Visual Studio。


有什么想法可以解决这个问题吗?

要解决您的问题,如果需要静态 C/C++ 运行时链接(/MT/MTd(,则应下载vs2010.zip,如果需要动态 C/C++ 运行时链接(/MT/MTd(,则应下载vs2010-dynamic.zip。两者都修复了VCUpgrade产生的潜在静默故障。


vs2010.zipvs2010-dynamic.zipvs2005-dynamic.zip都是从最新的GitHub资源构建的。在撰写本文时(2016 年 6 月 1 日(,这实际上是在 Crypto++ 5.6.4 之前。如果您使用的是具有较低级别的Crypto++的ZIP文件,例如5.6.2或5.6.3,那么您会遇到小问题。

我知道有两个小问题。首先是将bench.cpp重命名为 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(等。

解决方法是从 Visual Studio 项目文件中删除缺少的源文件,因为它们对于下层版本不存在。

另一种选择是从最新来源添加缺少的类文件,但可能会有复杂性。例如,许多来源巧妙地依赖于最新的config.hcpu.hcpu.cpp。"微妙之处"是你不会意识到你得到了一个表现不佳的课程。

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

可以通过

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

我将分享我的古玩答案,以防这对任何人有所帮助。我有一个同样的错误:mismatch detected for 'RuntimeLibrary'.我的问题如下。我有两个 CMakeLists.txt 文件:一个在根文件夹中,一个在子文件夹中。第一个什么也没做,只是包括第二个,如下所示:include(WTEX/test/SWT/testframe/CMakeLists.txt) .第二个是实际建立项目的那个。我的问题是我在这两个文件中都有一行:project(SOME_PROJ_NAME)。从第一个CMakeLists中删除该行后.txt它对我有用。

所以再一次,当我收到错误时,这是第一个CMakeLists.txt文件(来自根文件夹的文件(的内容:

cmake_minimum_required(VERSION 3.18)
project(SWT)
include(WTEX/test/SWT/testframe/CMakeLists.txt)

这是为我删除错误的内容:

cmake_minimum_required(VERSION 3.18)
include(WTEX/test/SWT/testframe/CMakeLists.txt)

最后,我只在第二个CMakeLists.txt中project(SOME_PROJ_NAME)了这一行。我认为您在哪个文件中拥有有关项目的 cmake 行并不重要,但必须只有一行。