9

SWIG バインディングを初めて実装した約 2 年前に、この問題に遭遇しました。大量のコードを公開するとすぐに、SWIG が出力する C++ ファイルのサイズが大きすぎて、コンパイラがそれらを処理できないという点に到達しました。この問題を回避する唯一の方法は、インターフェイスを複数のモジュールに分割し、それらを個別にコンパイルすることでした。

これにはいくつかの欠点があります。

• 各モジュールは、他のモジュールの依存関係を認識している必要があります。この側面を処理するインターフェイス ファイルを生成するスクリプトがありますが、複雑さが増します。

• モジュールを追加するたびに、動的リンカーがコードをロードするのに必要な時間が増加します。すべてのサブモジュールをインポートするinit .py ファイルを追加したので、コードが分割されているという事実はユーザーに透過的ですが、常に表示されるのは長い読み込み時間です。

現在、ビルド スクリプト/ビルド プロセスを見直しており、この問題の解決策が現在のものよりも優れているかどうかを確認したいと考えていました。理想的には、すべてのラッパー コードを含む 1 つの共有ライブラリが必要です。

SWIGでこれを達成する方法を知っている人はいますか? 特定のプロジェクト用に Ruby で記述されたカスタム コードをいくつか見たことがありますが、これを可能にするために出力が後処理されていますが、Python ラッパーの実現可能性を見ると、それほど簡単ではないように見えます。

4

2 に答える 2

2

私はTCLライブラリに対して同等のハックを行いました:私はいくつかのSWIGモジュールを使用し、いくつかの.oファイルにコンパイルされるいくつかの.cppファイルを生成しますが、単一のTCL「ロード」コマンドによってロードされる単一の.soファイルにそれらをすべてコンパイルします。

アイデアは、すべてのサブモジュール (Sub1 および Sub2) の初期化関数を呼び出すトップ swig モジュール (Top) を作成することです。

%module Top
%header %{
  extern "C" {
    SWIGEXPORT int Sub1_Init(Tcl_Interp *);
    SWIGEXPORT int Sub2_Init(Tcl_Interp *);
  }
%}
%init %{
    if (Sub1_Init(interp) != TCL_OK) {return TCL_ERROR;}
    if (Sub2_Init(interp) != TCL_OK) {return TCL_ERROR;}
%}

サブモジュール ファイルには特別なことは何もありません。最終的にファイル Top.so を作成し、コマンド「load ./Top.so」で TCL からロードします。

私はpythonを知りませんが、似ている可能性があります。ただし、python 拡張機能がどのようにロードされるかを理解する必要があるかもしれません。

于 2017-01-11T13:40:45.343 に答える
0

適切に分割されている場合、モジュールは必ずしも他のモジュールと同じ依存関係を持つ必要はありません - コンパイルを行うために必要なものだけです。適切に分割すれば、循環依存関係のないライブラリを作成できます。複数のライブラリを使用する際の問題は、デフォルトで SWIG がランタイム コードを静的に宣言し、その結果、あるモジュールから別のモジュールにオブジェクトを渡すときに問題が発生することです。SWIG ランタイム コードの共有バージョンを有効にする必要があります。

ドキュメントから (SWIG Web ページのドキュメント リンクが壊れています):

ランタイム関数は、SWIG で生成された各モジュールにプライベートです。つまり、ランタイム関数は「静的」リンケージで宣言され、そのモジュールで定義されたラッパー関数にのみ表示されます。このアプローチの唯一の問題は、複数の SWIG モジュールが同じアプリケーションで使用されている場合、それらのモジュールがしばしば型情報を共有する必要があることです。これは特に、SWIG がモジュールの境界を越える継承関係に関する情報を収集および共有する必要がある C++ プログラムに当てはまります。

ダウンロードしたドキュメントのそのセクション (セクション 16.2 The SWIG ランタイム コード) をチェックしてください。これを有効にして、あるモジュールから別のモジュールに渡されたときにオブジェクトを適切に処理できるようにする方法の詳細が説明されています。

FWIW、私は Python SWIG を使用したことはありませんが、Tcl SWIG を使用したことがあります。

于 2009-03-30T16:59:19.493 に答える