問題タブ [swig]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Swig で生成されたラッパーをインポートすると Python がハングする
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
java - JNI または JNA でウィンドウのタイトルを読み取るにはどうすればよいですか?
開発分野への復帰を目指しています。主に Java を使用してネイティブの win32 関数を呼び出します (.NET でビルドしたくありません)。
Java (JNI/JNA/SWIG) を使用して別の実行中のウィンドウからタイトルを読み取ることができる場所を教えてください。フックしようとしているアプリケーションがメモリ空間のどこにあるかを知っていると仮定します。
java - SWIGを使用してユーザー定義のクラスオブジェクトへのポインタを返すにはどうすればよいですか
私はswigでラップされた次のコードを持っています:
controller
プライベートコンストラクタがあります。
このようなものが例外をスローしないようにするための正しい呪文は何ですか?
perl - SWIGとの間でPerl配列を渡すにはどうすればよいですか?
Perlでは、私は潜水艦との間で配列を渡すことに慣れています
SWIGされた関数で同様の動作を実現するにはどうすればよいですか?
これをスウィッグする:
配列参照を期待し、配列参照を返すサブを生成しますか?SWIGに付属のstlテンプレートを使用しています。
このためのタイプマップを作成する必要がありますか?これはすでにどこかでカバーされているようです。
openssl - SWIGOpenSSL1.0-STACK_OFマクロの問題
以前のOpenSSLバージョンでは、SWIG.iファイルでこれを行うことができました。
OpenSSL 1.0.0beta3では、STACKが定義されていないように見えるため、これは失敗します。新しいOpenSSLは型チェックでより良い仕事をしようとするので、次のように定義されたSTACK_OFマクロを使用することになっています。
上記のコードをSTACK_OFを使用するように変更した場合:
次に、SWIGはこれを好きではありません:
これを次のように変更することで、コンパイルすることができます。
ただし、OpenSSLはマクロをリリースごとに変更する可能性があるため、これは明らかに良くありません。_STACK構造体がありますが、これもOpenSSLのプライベート詳細であり、リリースごとに変更される可能性があります。スタックは、次のようにパラメータとして入力することもできます。
SWIGも好きではありません。
OpenSSLの個人情報を使用せずにこれを機能させる方法はありますか?
c++ - 参照による Swig C++ Lua パス クラス
なぜこれで苦労しているのかわかりません。私がやりたいのはこれだけです:
私が抱えている問題は、このコードをスウィッグした後、lua スクリプトを適切に実行する方法がわからないことです。
私が得るエラーは「オーバーロードされた関数 'new_Foo2' の間違った引数」です: 考えられる c/c++ プロトタイプは次のとおりです: foo2() foo2(foo const &)
do f2 = f を使用しようとすると、同じことが起こります。私が理解しているように、すべてがポインターとして格納されているため、fooへのポインターを使用するコンストラクターを追加しようとしましたが、役に立ちませんでした。
swig - 複数の引数を 1 つの SWIG パラメータにまとめるにはどうすればよいですか
複数/可変引数を 1 つの入力パラメーターに変換する typemap を作成しようとしています。
たとえば、ベクトルを受け取る関数があるとします。
そして、私はそれをこのように呼びたいです(たまたまPerlにあります)
typemap は引数 ($argnum, ...) を取り、それらを 1 つのベクトルに集めてから、それを foo に渡す必要があります。
私はこれまでのところこれを持っています:
SWIGが引数の数をチェックすることを除いて、これは機能します
私が行った場合:
SWIG は、2 つの引数で foo を呼び出すことを期待します。
おそらく、foo の呼び出しから arg2 を抑制するように SWIG に指示する方法はありますか?
.i でこれを使用できません:
foo が期待しているタイプ (int の配列、文字列など) に応じて、異なるタイプマップが必要なためです。「...」に型を与える方法があるかもしれません。
これを行う方法はありますか?
c++ - C++の「変換で修飾子が失われます」コンパイルエラー
今日、SWIGタイプマップのデバッグ中に興味深い問題が発生しました。Visual C ++2008がからに変換するときに「変換で修飾子が失われる」エラーがスローされる理由を教えてourLib::Char *
くださいconst ourLib::Char * &
。私はType *
->const Type *
は些細な変換であり、(関数を呼び出すとき)Lvalue
->Lvalue &
も同様だと思いました。
編集:私たちが最終的に行った解決策:
const
fromを削除するconst ourLib::Char * tmp
と、説明したエラーが発生します。
c++ - Pythonの重要なC++拡張機能
私はかなり大きなC++ライブラリを持っており、それをサポートするいくつかのサブライブラリがあり、すべてをPython拡張機能に変換する必要があります。クロスプラットフォームである必要があるため、distutilsを使用していますが、より優れたツールがあれば、提案を受け付けています。
distutilsに最初にサブライブラリをコンパイルさせ、メインライブラリから拡張機能を作成するときにそれらをリンクさせる方法はありますか?