检测到'RuntimeLibrary'的不匹配

时间:2013-02-05 19:00:39

标签: c++ hash compilation sha256 crypto++

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

为了解决这个问题,我添加了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,没有别的。 我正在使用Windows 7 64位,今天我下载了VS C ++,因此它应该是最新版本。

4 个答案:

答案 0 :(得分:209)

(这已在评论中得到解答,但由于它缺少实际的答案,我正在写这篇文章。)

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

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

此设置目前有四个选项:

  1. 多线程调试
  2. 多线程调试DLL
  3. 多线程发布
  4. 多线程版本DLL
  5. 您的特定问题似乎源于您将使用“多线程调试”(即静态多线程调试CRT)构建的库与使用“多线程调试 DLL ”设置构建的程序相链接(即动态多线程调试CRT。)您应该在库中或程序中更改此设置。现在,我建议你在程序中更改它。

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

    对于(某些)更多信息,您可以看到这些信息(从上面的评论中链接):

      MSDN上的
    1. Linker Tools Warning LNK4098
    2. MSDN上的
    3. /MD, /ML, /MT, /LD (Use Run-Time Library)
    4. 关于Bugzilla @ Mozilla的
    5. Build errors with VC11 Beta - mixing MTd libs with MDd exes fail to link
    6. 更新 :(这是对一条评论的回应,该评论询问必须小心谨慎的原因。)

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

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

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

      现在,如果A调用标准库并获取一个对象,然后将该对象传递给B,并且B以任何方式接触该对象,则可能是B会弄乱该对象(例如,写错字段,或者在它结束之后等等。)

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

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

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

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

答案 1 :(得分:3)

  

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

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

  

任何想法如何解决这个问题?

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

vs2010.zipvs2010-dynamic.zipvs2005-dynamic.zip是根据latest GitHub sources构建的。在撰写本文时(2016年6月1日),这是有效的预加密++ 5.6.4。如果您使用的是具有低级Crypto ++的ZIP文件,例如5.6.2或5.6.3,那么您将遇到小问题。

我知道有两个小问题。首先是bench.cpp to 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)等。< / p>

修复方法是从Visual Studio项目文件中删除缺少的源文件,因为它们不适用于下层版本。

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:0)

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