2

botan暗号ライブラリを使用して最も基本的なプログラムを実行しようとしています。Botan1.1032ビットを使用しています。Windows7のインストーラーでバイナリを入手しました。IDEはVisualStudio2012です。

プロジェクトをbotan.libにリンクしましたが、プログラムは起動時にbotan.dllが見つからないことを報告するため、libはdllにリンクしているだけだと思います。したがって、botan.dllをDebugフォルダーに配置しました。

今問題に。

#include <iostream>

#include <botan/botan.h>
using namespace Botan;
using namespace std;

int main(int argc, char* argv[]) {
    try {
        cout << "d1";
        LibraryInitializer init;  //exception thrown here
    }
    catch(exception& e) {
        cout << "Exception caught: " << e.what() << std::endl;
    }
    cout << "d2";
    return 0;
}

Intellisenseはすべてを正常に検出します。デバッグしようとすると、次のようになります。

rsa.exeの0x6A1F2AA0(botan.dll)でのファーストチャンス例外:0xC0000005:アクセス違反の読み取り場所0x00310000。rsa.exeの0x6A1F2AA0(botan.dll)で未処理の例外:0xC0000005:アクセス違反の読み取り場所0x00310000。

botan.dll内で例外がスローされたようで、私の側ではそれをキャッチできません。ここから先に進むことはできません。

ライブラリへのリンクに何か問題がありましたか、それとも他に問題がありますか?感謝します。

4

3 に答える 3

4

私のコメントを拡張するには:

プログラムのリリース ビルドでもプログラムがクラッシュする場合は、ソースをダウンロードして自分でビルドする必要があります (ビルドを構成するには Python が必要です)。

リリース ビルドがクラッシュしない場合は、デバッグ ビルドのプロジェクト設定で/RTCs Stack Framesランタイム チェックを無効にすることができC++/Code Generationます。これがクラッシュの原因になっているようです。Both設定を からに変更する/RTCu Uninitialized Variables か、 に設定して完全に無効にしますDefault

これは回避策であり解決策ではないため、botan を自分でビルドし、リリース バージョンとデバッグ バージョンの両方をビルドすることを検討する必要があります (その後、デバッグ ビルドでデバッグ バージョンにリンクし、デバッグ ランタイム チェックをそのままにしておくことができます。

ビルド方法についてはドキュメントを参照してください(構成を実行するにはpythonが必要です)。

リリース バージョン (デフォルト) をビルドしたら、次のファイルを別のディレクトリ (たとえばC:\Botan\release\) にコピーします。そうしないと、デバッグ バージョンをビルドするときに上書きされます。

  • ボタン.dll
  • ボタン.exp
  • ボタン.lib
  • botan.dll.manifest

configure を再度実行して、今度は--enable-debugオプションを追加します。

> python configure.py --cc=msvc --enable-debug

もう一度ビルドします。今回は、上記のファイルを にコピーしますC:\Botan\debug\

デバッグ ビルドの場合は debug ディレクトリのライブラリにリンクし、リリース ビルドの場合は release ディレクトリにあるライブラリにリンクするようにプロジェクトを構成します。最後に、実行時にプログラムが適切な DLL をロードすることを確認してください。

于 2012-12-27T20:23:08.737 に答える
-1

これは Windows であるため、C++ 例外がモジュールの境界を越えることはありません。したがって、C++ 例外をキャッチしようとしても、これを認識できません。アクセス違反を手に入れたい場合は、代わりに構造化例外処理を使用する必要があります。

.dll がクラッシュする理由を調べるには、アクセス違反が発生したときに Visual Studio がデバッガーに割り込むように設定する必要があります。Debug -> Exceptionsに移動し、 Win32 Exceptionsの下のc0000005 Access violationThrownチェックボックスをオンにします。デバッガーに入ると、デバッグ シンボルを読み込むことができます (それらが利用可能であると仮定します)。コール スタックとパラメータから、失敗の理由がよくわかります。

ソースが利用できるように見えるので、自分で Debug .dll をコンパイルすることもできます。これにより、適切なデバッグ シンボルが生成されるだけでなく、クラッシュのソース レベルのデバッグが有効になります。これにより、目前の問題を診断するために必要なすべての情報が得られる可能性があります。

于 2012-12-26T16:47:30.693 に答える