web-dev-qa-db-ja.com

「RuntimeLibrary」の不一致が検出されました

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++を今日ダウンロードしたので、最新バージョンであるはずです。

102
Momonga

(これはすでにコメントで回答されていますが、実際のanswerがないため、これを書いています。)

この問題は、Visual C++の新しいバージョンで発生します(古いバージョンは通常、プログラムをサイレントにリンクするだけで、実行時にクラッシュして書き込みます)。これは、プログラムとリンクしているライブラリの一部(またはソースの一部さえも)プログラム自体の内部ファイル)は、異なるバージョンのCRT(C RunTimeライブラリ)を使用しています

このエラーを修正するには、Project Properties(および/または使用しているライブラリのもの)、C/C++Code Generation、そしてRuntime Libraryの値を確認する必要があります。これは、リンクしているファイルとライブラリallでまったく同じである必要があります。 (DLLとリンクするためのルールはもう少し緩和されていますが、ここでは「理由」と詳細については説明しません。)

現在、この設定には4つのオプションがあります。

  1. マルチスレッドデバッグ
  2. マルチスレッドデバッグDLL
  3. マルチスレッドリリース
  4. マルチスレッドリリースDLL

あなたの特定の問題は、「マルチスレッドデバッグDLL」を使用してビルドされているプログラムに対して「マルチスレッドデバッグ」(つまり、静的マルチスレッドデバッグCRT)でビルドされたライブラリをリンクすることに起因するようです設定(つまり、ダイナミックマルチスレッドデバッグCRT)。この設定は、ライブラリまたはプログラムで変更する必要があります。今のところ、プログラムでこれを変更することをお勧めします。

Visual Studioプロジェクトは、デバッグビルドとリリースビルド(および32/64ビットビルド)に異なるプロジェクト設定セットを使用するため、これらのプロジェクト構成すべてで設定が一致することを確認する必要があります。

(一部)詳細については、これらを見ることができます(上記のコメントからリンクされています):

  1. リンカーツール警告LNK4098 MSDN
  2. / MD、/ ML、/ MT、/ LD(ランタイムライブラリを使用) MSDN
  3. VC11 Betaでのビルドエラー-MTdライブラリとMDd exeの混合がリンクに失敗する on Bugzilla @ Mozilla

UPDATE:(これは、このような注意を払う必要がある理由を尋ねるコメントへの応答です。)

一緒にリンクする2つのコード自体が標準ライブラリにリンクして使用している場合、greatの方法に注意しない限り、標準ライブラリは両方で同じでなければなりません2つのコードが相互作用し、データをやり取りします。一般に、ほとんどすべての状況で、標準ライブラリランタイムのまったく同じバージョンを使用するだけです(デバッグ/リリース、スレッド、および明らかにイテレータデバッグなどのVisual C++のバージョンに関して)

問題の最も重要な部分はこれです:関数呼び出しの両側のオブジェクトのサイズについて同じ考えを持つ

たとえば、上記の2つのコードがAおよびBと呼ばれることを考慮してください。 Aは標準ライブラリの1つのバージョンに対してcompiledであり、Bは別のバージョンに対してです。 Aのビューでは、標準関数が返すランダムオブジェクト(メモリブロック、イテレータ、またはFILEオブジェクトなど)には、特定のサイズとレイアウトがあります(構造レイアウトは、いくつかの理由のいずれかのために、同じオブジェクトのサイズ/レイアウトに関するBの考え方は異なります(追加のデバッグ情報、時間の経過に伴うデータ構造の自然な進化などが原因である可能性があります)

ここで、Aが標準ライブラリを呼び出してオブジェクトを取得し、そのオブジェクトをBに渡し、Bが何らかの方法でそのオブジェクトに触れた場合、Bがそのオブジェクトを混乱させる可能性があります等)

起こりうる問題は上記の問題だけではありません。標準ライブラリの内部グローバルまたは静的オブジェクトも問題を引き起こす可能性があります。また、より多くの不明瞭なクラスの問題もあります。

Libs(静的ランタイムライブラリ)の代わりにDLL(動的ランタイムライブラリ)を使用すると、いくつかの点でこれはすべて奇妙になります。

この状況は、連携する2つのコードで使用されるすべてのライブラリに適用できますが、標準ライブラリはほとんど(ほとんどではないにしても)のプログラムで使用され、衝突の可能性が高くなります。

私が説明したのは、明らかに、ライブラリバージョンを混在させると、実際の混乱の簡略化された簡略化されたバージョンです。どうしてそれをしてはいけないのか、それがあなたの考えを与えることを願っています!

213
yzt

C:\ cryptoppにCrypto ++をダウンロードして抽出しました。 Visual Studio Express 2012を使用して(readmeの指示に従って)内部のすべてのプロジェクトをビルドし、すべてが正常にビルドされました。次に、他のフォルダーにテストプロジェクトを作成し、依存関係としてcryptolibを追加しました。

変換はおそらく成功しませんでした。成功した唯一のことは、VCUpgradeの実行でした。実際の変換自体は失敗しましたが、表示されているエラーが発生するまでわかりません。詳細の一部については、Crypto ++ wikiの Visual Studio を参照してください。


これを修正する方法はありますか?

問題を解決するには、 vs2010.Zip をダウンロードする必要があります。静的C/C++ランタイムリンクが必要な場合(/MTまたは/MTd)、または vs2010-dynamic.Zip 動的C/C++ランタイムリンクが必要な場合( /MTまたは/MTd)。どちらも、VCUpgradeによって生成される潜在的なサイレント障害を修正します。


vs2010.Zipvs2010-dynamic.Zip および vs2005-dynamic.Zip は、 最新のGitHubソース から構築されます。この記事の執筆時点(2016年6月1日)では、実質的にCrypto ++ 5.6.4より前のバージョンです。 5.6.2や5.6.3などの下位レベルのCrypto ++でZipファイルを使用している場合、小さな問題が発生します。

私が知っている2つの小さな問題があります。最初に bench.cppbench1.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に変更します。このファイルは削除しないでください。

2番目の問題は、移動するターゲットであるため、少し複雑です。 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)などがあります。

修正は、ダウンレベルリリースには存在しないため、不足しているソースファイルをVisual Studioプロジェクトファイルから削除することです。

別のオプションは、不足しているクラスファイルを最新のソースから追​​加することですが、複雑になる可能性があります。たとえば、多くのソースは最新のconfig.hcpu.hcpu.cppに微妙に依存しています。 「微妙」とは、パフォーマンスの低いクラスを獲得していることに気付かないことです。

パフォーマンスの低いクラスの例はBLAKE2です。 config.hは、コンパイル時のARM-32およびARM-64検出を追加します。 cpu.hおよびcpu.cppは、ランタイムARM命令検出を追加します。これは、コンパイル時の検出に依存します。他のファイルを使用せずにBLAKE2を追加すると、検出は行われず、C/C++の実装がそのまま実行されます。おそらく、バニラC/C++の場合はバイトあたり40サイクル程度であるのに対し、バイトあたり約9〜12サイクルで実行されるNEONの機会を逃していることに気付かないでしょう。

3
jww

ITERATOR_DEBUG_LEVELの不一致とともにこの問題が発生しました。日曜日の夕方の問題は結局のところ大丈夫で良いように思えたので、私はしばらくの間消されました。 VS2017での作業IDE(ソリューションエクスプローラー)最近、別のプロジェクトからプロジェクト(ctrl-drag)へのソースファイル参照を追加/コピーしました。プロパティを調べる-> C/C++/Preprocessor-プロジェクトレベルではなくソースファイルレベル-リリース構成で、このソースファイルに対してNDEBUGの代わりに_DEBUGが指定されていることに気付きました。問題を取り除くために必要なすべての変更でした。

3
Jan

この問題は、リンカーライブラリにmsvcrtd.libのCRTを追加することで解決できます。 cryptlib.libはデバッグのCRTバージョンを使用したためです。

0
abhijithkp