Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检测到';RuntimeLibrary';_C++_Hash_Compilation_Sha256_Crypto++ - Fatal编程技术网

C++ 检测到';RuntimeLibrary';

C++ 检测到';RuntimeLibrary';,c++,hash,compilation,sha256,crypto++,C++,Hash,Compilation,Sha256,Crypto++,我下载并提取了C:\cryptopp中的Crypto++。我使用Visual Studio Express 2012构建了其中的所有项目(如自述文件中所述),所有项目都成功构建。然后,我在其他文件夹中创建了一个测试项目,并添加了cryptolib作为依赖项。之后,我添加了include路径,这样我就可以轻松地包含所有的头。当我试图编译时,我得到了一个关于未解析符号的错误 为了解决这个问题,我添加了C:\cryptopp\Win32\Output\Debug\cryptolib.lib来链接其他依

我下载并提取了C:\cryptopp中的Crypto++。我使用Visual Studio Express 2012构建了其中的所有项目(如自述文件中所述),所有项目都成功构建。然后,我在其他文件夹中创建了一个测试项目,并添加了cryptolib作为依赖项。之后,我添加了include路径,这样我就可以轻松地包含所有的头。当我试图编译时,我得到了一个关于未解析符号的错误

为了解决这个问题,我添加了
C:\cryptopp\Win32\Output\Debug\cryptolib.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
我试图编译的代码很简单(我从另一个站点获得):

#包括
#包括
#包括“sha.h”
#包括“十六进制h”
使用名称空间std;
字符串SHA256(字符串数据){
字节常量*pbData=(字节*)data.data();
unsigned int-ndalen=data.size();
字节abDigest[32];
CryptoPP::SHA256().CalculateDigest(abDigest、pbData、Ndalen);
返回字符串((char*)abDigest);
}
内部主(空){
返回0;
}
有没有办法解决这个问题?我现在只需要SHA-256,别的什么都不需要。 我使用Windows 7 64位,我今天下载了VC++,所以应该是最新版本。

(这是在评论中已经回答了,但是因为它没有一个实际的答案,所以我写这个)。 这个问题出现在Visual C++的新版本中(旧版本通常只是默默地链接程序,在运行时会崩溃和烧毁)。这意味着你与程序链接的一些库(或者甚至程序本身中的一些源文件)使用了不同版本的CRT。(C运行时库)

要更正此错误,您需要进入
项目属性(和/或您正在使用的库的属性),然后进入
C/C++
,然后进入
代码生成
,并检查
运行时库的值;对于链接在一起的所有文件和库,这应该完全相同。(链接DLL的规则稍微宽松一些,但我不打算在这里讨论“为什么”和更多细节。)

此设置当前有四个选项:

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

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

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

  • 关于MSDN
  • 关于MSDN
  • 在Bugzilla@Mozilla
  • 更新:(这是对一条评论的回应,该评论询问必须如此小心的原因。)

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

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

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

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

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

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

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

    我所描述的显然是一个经过淡化和简化的版本,如果你混合了库的版本,它会让你明白为什么你不应该这样做

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

    转换可能不成功。唯一成功的是运行VCUpgrade。实际转换本身失败,但直到
    #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;
    }