这是一个菜鸟问题。我正在尝试学习如何使用 SWIG 为 C++ 库制作 python 接口。该库是专有的第 3 方库;它以头文件 (foo.h) 和静态存档 (libfoo.a) 的形式出现在我面前。
为了简化问题,我编写了一个我认为具有相同病理的示例。无论如何,相同的错误消息。
/* foo.hpp */
class TC {
public:
TC();
int i;
private:
};
作为参考,这里是 foo.c。我只有真正的第 3 方库的头文件和存档文件。
/*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"
我通过键入生成 foo_wrap.cxx
swig -python -c++ foo.i
然后编译。
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 吗?大概可以手动完成,但不应该有一些自动化的方法吗?