2011-01-05 18 views
1

これは問題の質問です。私はSWIGを使ってC++ライブラリ用のPythonインターフェイスを作成する方法を学びたいと考えています。図書館は独自の第三者図書館です。ヘッダーファイル(foo.h)と静的アーカイブ(libfoo.a)の形で私に届きます。静的ライブラリ用のSWIG Pythonラッパーをコンパイルしますか?

問題を単純化するために、同じ病理を持っていると思う例を整理しました。とにかく同じエラーメッセージ。

/* foo.hpp */ 
class TC { 
    public: 
     TC(); 
     int i; 
    private: 
}; 

参考までに、ここにfoo.cがあります。私は実際のサードパーティライブラリのヘッダとアーカイブファイルしか持っていません。次のように

/*foo.cxx */ 
#include "foo.hpp" 
TC::TC() { 
    i = 0; 
} 

私はg++ -c foo.cxx && ar rcs libfoo.a foo.o

マイSWIGインタフェースファイルを入力して、このライブラリを作ったのです。

/* foo.i */ 
%module foo 
%{ 
#include "foo.hpp" 
%} 
%include "foo.hpp" 

私は

swig -python -c++ foo.i 

を入力してfoo_wrap.cxxを生成してコンパイル。

g++ -c -fPIC -I/usr/include/python2.6 foo_wrap.cxx 
g++ -shared -L. -lfoo -lpython2.6 -Wl,-soname,_foo.so foo_wrap.o -o _foo.so 

コンパイルは成功しますが、私は、Pythonを実行しimport fooとき、私は未定義のシンボルエラーを取得します。

>>> import foo 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
    File "foo.py", line 25, in <module> 
    _foo = swig_import_helper() 
    File "foo.py", line 21, in swig_import_helper 
    _mod = imp.load_module('_foo', fp, pathname, description) 
ImportError: ./_foo.so: undefined symbol: _ZN2TCC1Ev 

ここでは何が起こっていますか?問題は、リンクするステップがコンストラクタTC :: TCの定義を見つけていないことが原因と思われる。

注:私は

g++ -shared -L. -lfoo -lpython2.6 -Wl,-soname,_foo.so foo_wrap.o -o _foo.so 

にリンクするステップを変更する場合は、すべての作品。しかし、私が実際のソースコードを持っていない私の本当の問題のための選択肢ですか? .aから.oを抽出できますか?おそらく手でこれを行うことができますが、それを行うための自動化された方法はないでしょうか?

答えて

6

私はそれがあなたにとって大事なことではありませんが、一般的にはオブジェクトファイルと静的ライブラリの順序が重要です。順序は、初期化の順序を定義します。

最も一般的なオブジェクトや静的アーカイブを最後のパラメータとして配置する必要があります。ほとんどの依存関係を持つオブジェクト/アーカイブは最初に置かなければなりません。

例。オブジェクトファイルA.oは機能A()を提供します。オブジェクトB.oは関数A()を使用します。 ld -o libmy.so B.o A.o(最後のパラメータとして最も一般的なファイルA.o)を記述する必要があります。

記号がファイルに存在する場合は、objdump -x _foo.soでチェックすることもできます。

右の呼び出しは次のようになります。

g++ -shared -L. -lpython2.6 -Wl,-soname,_foo.so foo_wrap.o -lfoo -o _foo.soが-lpython2.6と混同してはいけない、それはランタイムでリンクダイナミックライブラリです。

+0

このコメントは教育的なもので、私の問題を解決したようです。ありがとうございました!残念ながら、私はupvoteに十分な評判を持っていません。 – user1504

+0

あなたの答えを受け入れることによって、私はあなたに投票を与えるのに十分な担当者を得ました! – user1504

関連する問題