0

やや複雑な C++ dll を組み込む必要がある Python GUI アプリケーションがあります。boost.python を調べましたが、プログラムに 5 つの個別の C++ ファイルが含まれており、C++ コーディングの経験がないため、問題がありました。Python で動作する「Hello World」C++ dll のテストを取得できましたが、その C++ コードは、必要な dll に比べて単純です。

Visual Basic プロジェクトで動作するように dll を取得しましたが、Python で同じアプリケーションに最適なソリューションを探しています。

Python で C++ コードを完全に書き直すか、boost.python ラッパーを正しくコーディングするのが最善でしょうか? Python でコードを書き直すのに必要な時間が、ラッパーをコーディングするのにかかる時間と同等である場合、コードを完全に書き直す方が好ましいでしょうか?

dll コードをコンパイルされた言語から解釈された言語に変換すると、ポジティブな影響よりもネガティブな影響が大きくなりますか?

前もって感謝します、

ガレット

4

2 に答える 2

0

私の経験では、最も簡単な方法は ctypes です: http://docs.python.org/2/library/ctypes.html

これは、いくつかの C 関数でインターフェイスを表現できる限り機能します。ほとんどの C++ ライブラリでは、使用するためにクラスをサブクラス化する必要がない限り、これは簡単です。

利点:

  • Python の特別な考慮事項なしで DLL をコンパイルします (したがって、他の回答で言及されているバージョン管理の問題はありませんhttps://stackoverflow.com/a/18606365/1413374 )
  • ブーストやスウィグなどのサードパーティのフレームワークに依存しません。
  • いずれにせよ、ABI の安定性の理由から、DLL に C インターフェイスを使用することは良いことです。(クラス メンバーを追加すると、たとえプライベートであっても、C++ クラスの ABI が変更されます)

どうすればこれを行うことができますか?最初に調べたのはCtypesでしたが、C++のdllではうまく動かないという印象をあちこちで受けました。

関数を宣言しますextern "C"。これは簡単な部分です。詳細は、優れた C++ の本に記載されています。難しいのは、テンプレートや継承などの C++ 機能を必要としない方法でインターフェイスを設計することです。"Abstract Datatypes" (ADT) は、この種の優れた設計原則です。調べる。より詳細なヘルプについては、C++ ライブラリのインターフェイスまたはその一部を投稿していただけると助かります。例を挙げて説明します。

もう 1 つの問題は、C++ ランタイムです。それは何らかの形で DLL にリンクされている必要があります。Linux を使用している場合は、libtool を使用することをお勧めします。Windowsについてはわかりません。多分それはうまくいきます。そうでない場合は、お気に入りの検索マシンにエラー メッセージを入力してください。

于 2013-09-04T19:07:13.990 に答える