检测到“RuntimeLibrary”不匹配

我在C:\ cryptopp下载并提取了Crypto ++。 我使用Visual Studio Express 2012来构build所有项目(如自述文件中所述),并且所有内容都已成功构build。 然后我在其他文件夹中做了一个testing项目,并添加cryptolib作为依赖项。 之后,我添加了包含path,所以我可以很容易地包含所有的头文件。 当我试图编译时,我得到了一个关于未解决符号的错误。

为了弥补这一点,我添加了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 RunTime库)。

为了纠正这个错误,你需要进入你的Project Properties (和/或你正在使用的库),然后进入C/C++ ,然后Code Generation ,并检查Runtime Library的值; 对于所有连接在一起的文件和库,这应该是完全相同的。 (这些规则对于链接DLL来说更轻松一些,但是我不打算在这里进入“为什么”和更多的细节。)

目前有四个选项可供select:

  1. multithreadingdebugging
  2. multithreadingdebuggingDLL
  3. multithreading发布
  4. multithreading发布DLL

您的特殊问题似乎源于您链接使用“multithreadingdebuggingDLL ”设置(即dynamicmultithreadingdebuggingCRT)正在构build的程序链接使用“multithreadingdebugging”(即静态multithreadingdebuggingCRT)构build的 。您应该更改这个设置可以在库中,也可以在你的程序中。 现在,我build议在你的程序中改变它。

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

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

  1. 链接器工具在MSDN上警告LNK4098
  2. / MD,/ ML,/ MT,/ LD(在MSDN上使用运行时库)
  3. 使用VC11 Beta构build错误 – 将MDd ext与MTd库混合无法链接到Bugzilla @ Mozilla

更新 :(这是为了回应一个意见,要求我们必须小心谨慎。)

如果我们链接在一起的两段代码本身是链接到标准库的,那么标准库必须是相同的,除非我们仔细考虑了两个代码段如何交互和传递数据。 一般来说,对于几乎所有的情况,只要使用完全相同版本的标准库运行时(关于debugging/发布,线程,显然是Visual C ++的版本,其中包括迭代器debugging等)

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

考虑一个例子,上面的两段代码被称为AB A是针对标准库的一个版本编译的 ,B是针对另一个版本编译的 。 在A看来,标准函数返回给它的一些随机对象(例如一块内存,一个迭代器或者一个FILE对象或者其他)具有一些特定的大小和布局(记住结构布局是在C编译时确定和修正的/ C ++)。出于以下几种原因之一,B关于同一对象的大小/布局的想法是不同的(可能是因为附加的debugging信息,随着时间的推移数据结构的自然演变等)

现在,如果A调用标准库并获取对象,然后将该对象传递给B,并且B以任何方式触及该对象,那么B有可能将该对象弄乱了(例如,写错字段,它等等)

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

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

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

我所描述的显然是一个淡化和简化版本的实际混乱,等待着你,如果你混合库版本。 我希望它给你一个你为什么不应该这样做的想法!

我在C:\ cryptopp下载并提取了Crypto ++。 我使用Visual Studio Express 2012来构build所有项目(如自述文件中所述),并且所有内容都已成功构build。 然后我在其他文件夹中做了一个testing项目,并添加cryptolib作为依赖项。

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


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

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


vs2010.zipvs2010-dynamic.zipvs2005-dynamic.zip是从最新的GitHub源码构build的。 截至撰写本文(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 ,findbench1.cpp ,然后将其重命名为bench.cpp 。 或(2)在文件系统bench.cpp bench1.cpp重命名为bench1.cpp 。 请不要删除这个文件。

第二个问题是有点棘手,因为它是一个移动的目标。 像5.6.2或5.6.3这样的低级版本,缺lessGitHub中可用的最新类。 (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项目文件中删除缺less的源文件,因为它们不存在于低层版本中。

另一个select是从最新的来源添加丢失的类文件,但可能会有复杂性。 例如,许多资源巧妙地依赖于最新的config.hcpu.hcpu.cpp 。 “微妙”是你不会意识到你正在得到一个performance不佳的课程。

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