144

Crypto++をC:\cryptoppにダウンロードして解凍しました。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だけが必要で、他には何も必要ありません。私はWindows764ビットを使用していますが、今日VS C ++をダウンロードしたので、最新バージョンである必要があります。

4

4 に答える 4

270

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

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

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

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

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

特定の問題は、「マルチスレッドデバッグ」(つまり、静的マルチスレッドデバッグCRT)で構築されたライブラリを、「マルチスレッドデバッグDLL」設定(つまり、動的マルチスレッドデバッグCRT)を使用して構築されているプログラムにリンクすることに起因するようです。この設定は、ライブラリまたはプログラムのいずれかで行われます。今のところ、プログラムでこれを変更することをお勧めします。

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

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

  1. MSDNのリンカーツール警告LNK4098
  2. MSDNの/MD、/ ML、/ MT、/ LD(ランタイムライブラリを使用)
  3. VC11ベータ版でのビルドエラー-MTdライブラリとMDdexeを混在させると、Bugzilla@Mozillaでリンクできなくなります

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

リンクしている2つのコード自体が標準ライブラリに対してリンクして使用している場合、2つのコードが相互作用してデータを渡す方法に細心の注意を払わない限り、標準ライブラリは両方で同じである必要があります。一般に、ほとんどすべての状況で、標準ライブラリランタイムのまったく同じバージョンを使用すると思います(デバッグ/リリース、スレッド、そして明らかにイテレータデバッグなどのVisual C ++のバージョンに関して)

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

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

ここで、Aが標準ライブラリを呼び出してオブジェクトを取得し、そのオブジェクトをBに渡し、Bがそのオブジェクトに何らかの方法で触れた場合、Bがそのオブジェクトを台無しにする可能性があります(たとえば、間違ったフィールドを書き込んだり、終わりを過ぎたりします)。のなど)

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

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

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

私が説明したのは、明らかに、ライブラリバージョンを混在させる場合にあなたを待っている実際の混乱の骨抜きで単純化されたバージョンです。それがあなたがそれをすべきではない理由のアイデアをあなたに与えることを願っています!

于 2013-09-05T12:00:09.600 に答える
8

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

于 2018-07-22T19:03:34.207 に答える
3

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

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


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

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


vs2010.zipvs2010-dynamic.zipおよび最新のGitHubソースvs2005-dynamic.zipから構築されています。この記事の執筆時点(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)などがあります。

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

もう1つのオプションは、最新のソースから欠落しているクラスファイルを追加することですが、複雑になる可能性があります。たとえば、ソースの多くは、最新の、、およびに微妙に依存してconfig.hcpu.hますcpu.cpp。「微妙な点」とは、成績の悪いクラスを受講していることに気付かないことです。

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

于 2015-10-24T02:06:51.053 に答える
1

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

于 2019-06-20T09:30:50.430 に答える