检测到'RuntimeLibrary'的不匹配

Mom*_*nga 104 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
Run Code Online (Sandbox Code Playgroud)

我也得到:

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
Run Code Online (Sandbox Code Playgroud)

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

任何想法如何解决这一问题?我现在真的只需要SHA-256,没有别的.我使用的是Windows 7 64位,今天我下载了VS C++,因此它应该是最新版本.

yzt*_*yzt 218

(这已在评论中得到回答,但由于它缺乏实际答案,我正在写这篇文章.)

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

要更正此错误,您需要进入您的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(使用运行时库)
  3. 使用VC11 Beta构建错误 - 将MTd库与MDd exes混合在Bugzilla @ Mozilla上无法链接

更新 :(这是对一条评论的回应,该评论要求必须采取这种措施.)

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

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

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

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

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

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

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

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


Jan*_*Jan 7

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