これは問題の質問です。私は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を抽出できますか?おそらく手でこれを行うことができますが、それを行うための自動化された方法はないでしょうか?
このコメントは教育的なもので、私の問題を解決したようです。ありがとうございました!残念ながら、私はupvoteに十分な評判を持っていません。 – user1504
あなたの答えを受け入れることによって、私はあなたに投票を与えるのに十分な担当者を得ました! – user1504