c++ - 检测到 'RuntimeLibrary' 不匹配

标签 c++ hash compilation sha256 crypto++

我在 C:\cryptopp 中下载并解压了 Crypto++。我使用 Visual Studio Express 2012 来构建里面的所有项目(按照 readme 中的说明),一切都构建成功。然后我在其他文件夹中创建了一个测试项目,并添加了 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++,所以它应该是最新版本。

最佳答案

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

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

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

此设置目前有四个选项:

  • 多线程调试
  • 多线程调试 DLL
  • 多线程发布
  • 多线程发布 DLL

  • 您的特定问题似乎源于您将使用“多线程调试”(即静态多线程调试 CRT)构建的库与使用“多线程调试 DLL”设置(即动态多线程调试 CRT)构建的程序相链接。您应该更改此设置在库中或您的程序中。现在,我建议在您的程序中更改此设置。

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

    有关(一些)更多信息,您可以看到这些(从上面的评论链接):
  • Linker Tools Warning LNK4098在 MSDN
  • /MD, /ML, /MT, /LD (Use Run-Time Library)在 MSDN
  • Build errors with VC11 Beta - mixing MTd libs with MDd exes fail to link关于 Bugzilla@Mozilla

  • 更新 :(这是对评论的回应,该评论要求必须如此小心的原因。)

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

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

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

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

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

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

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

    如果您混合库版本,我所描述的显然是等待您的实际困惑的淡化和简化版本。我希望它能让您了解为什么不应该这样做!

    关于c++ - 检测到 'RuntimeLibrary' 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14714877/

    相关文章:

    arrays - perl - 尝试根据值对 'hashes' 数组进行排序

    ruby - 如何在哈希数组中搜索包含某个键值对的哈希名称? ( ruby )

    compilation - 编译并行netCDF时出错

    C++ 只打印一条语句

    java - JNI_CreateJavaVM函数方法不起作用,无法调试

    c++ - OMNeT++ 反汇编收到的消息

    C++ Visual Studio 运行时错误

    ruby - 1.8.6 的哈希#key

    go - 在 OSX 上交叉编译 Go?

    c++ - cuda:使用共享和全局的矩阵乘法