c++ - 为静态库编译 SWIG Python 包装器?

标签 c++ python static-libraries swig undefined-symbol

这是一个菜鸟问题。我正在尝试学习如何使用 SWIG 为 C++ 库制作 python 接口(interface)。该库是专有的第 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接口(interface)文件如下:

/* 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 时,出现 undefined symbol 错误。

>>> 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 吗?大概可以手动完成这项工作,但难道不应该有一些自动化的方法吗?

最佳答案

我不太确定您是否属于这种情况,但一般来说目标文件和静态库的顺序很重要。该顺序定义了初始化的顺序。

您必须将最通用的对象和/或静态存档作为最后一个参数。具有最多依赖性的对象/文件必须放在开头。

一个例子。目标文件 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 混淆,它是运行时链接的动态库。

关于c++ - 为静态库编译 SWIG Python 包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4608780/

相关文章:

使用堆栈的 C++ 后缀计算器

python - 使用 celery 从另一个周期性任务运行任务

python - 如何删除文件中使用 python 中的正则表达式确定范围的行?

c++ - 链接器如何处理链接到共享库的 C++ 静态库的唯一类型信息约束?

c# - 如何在 C# 项目的 C++ 静态库中设置断点?

c++ - 如何使用chrono查看我的排序算法每次迭代花费多长时间?

c++ - 哪一个使用c++ STL容器或MFC容器?

python - 多个 Re.Subs Python

windows - 在 Windows 上使用 CMake 和相对路径创建交叉编译的存档(静态库)

c++ - 我怎么知道 std::map 插入是成功还是失败?