3

C++ 共有ライブラリを Python 2.5 の Windows バージョンにインポートしようとすると、Python が「ハング」し、その理由がわかりません。

Linux では、すべて正常に動作します。すべての C++ コードをコンパイルして、swig ラッパー クラスを生成できます。それらはコンパイルされ、Python 2.5 または 2.6 のいずれかでインポートおよび使用できます。現在、Cygwin を使用してコードを Windows に移植しようとしています。

-mno-cygwin を使用して、各 C++ ライブラリを共有 dll にコンパイルできます。これにより、cygwin1.dll への依存が削除されます。基本的に、これにより gcc ターゲットが Cygwin ではなく MinGW になり、結果のバイナリを Cygwin に依存せずに Windows で実行できるようになります。さらに、これらの共有ライブラリはそれぞれ、c++ バイナリにリンクして正常に実行できます。

これが完了したら、swig を使用して各共有ライブラリのラッパーを生成しました。これらのラッパーは、問題なく生成、コンパイル、およびリンクされます。

次のステップは、生成された python ラッパーを python にインポートすることでした。2 つを除くすべてのライブラリをインポートできます。動作しない 2 つのファイルについては、.py ファイルまたは .pyd ファイルのいずれかを Windows python (Visual C++ でコンパイルされたバージョン) にインポートしようとすると、python がハングします。ctrl+c または ctrl+d で Python を強制終了することはできません。唯一の手段は、タスク マネージャーを介して Python を強制終了することです。gdb を python プロセスにアタッチしてスタック トレースを出力すると、ほとんどがゴミになり、何の役にも立ちません。

次に、*.i ファイル内のコード ブロックを ifdef して、swig ラッパーを再作成してみました。このプロセスにより、少なくともライブラリを Windows python にインポートすることができましたが、問題は、ソフトウェアの実行に必要な関数をコメントアウトしなければならなかったことです。一般に、コメント アウトする必要がある関数には、静的関数、仮想 const 関数、および const として宣言されていない通常のパブリック関数の 3 種類がありました。これも再現可能です。これらの関数のいずれかのコメントを外すと、インポートが再びハングします。

次に、関数を単純な hello world プログラムに抽出し、swig ラッパーを生成して Python にインポートしてみました。これはうまくいきました。ヘッダー ファイルから関数を正確にコピーしました。それらは非常に小さなテスト プログラムでは機能しますが、より大きな共有ライブラリでは機能しません。私たちはそれらをまったく同じ方法で構築しています。

したがって、なぜこれが起こっているのか、またはより良いデバッグ手法についてのアイデアは非常に役立ちます。

これらは Linux で gcc 3 および 4 と python 2.5 および 2.6 で正常に動作します。Windows では、これは私が使用しているソフトウェアです: gcc 3.4.4 swig 1.39 (swig.org からの Windows バイナリ) python 2.5.4 (python.org からの Windows バイナリおよび include/libs)

これらは、単純な hello world プログラムを構築するために使用しているコマンドです (完全なライブラリは同じオプションを使用します。-I、-L、および -l オプションが追加されているため、より長くなります)。

swig -c++ -python -o test_wrap.cc test.i

gcc -c -mno-cygwin test.cc

gcc -c -mno-cygwin test_wrap.cc -I/usr/python25/include

dlltool --export-all --output-def _test.def test.o

gcc -mno-cygwin -shared -s test_wrap.o test.o -L/usr/python25/libs -lpython25 -lstdc++ -o _TestModule.pyd

ありがとう、AJ

4

1 に答える 1

1

私が使用した手法は__asm int 3、モジュールの init 関数に「ハード」ブレークポイント ( ) を挿入することです。次に、デバッガーを介して実行するか、単に実行して、割り込みが呼び出されたときに Windows デバッガーをポップさせます。

Microsoft のこちらから Windows デバッガーをダウンロードできます。

于 2009-07-28T21:54:50.677 に答える