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

2024-04-18

这是一个菜鸟问题。我正在尝试学习如何使用 SWIG 为 C++ 库制作 python 接口。该库是专有的第三方库;它以头文件(foo.h)和静态存档(libfoo.a)的形式出现在我面前。

为了简化问题,我编造了一个我认为具有相同病理学的例子。无论如何,同样的错误消息。

/* 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"

我通过输入生成 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 吗?想必人们可以手动完成此操作,但不应该有某种自动化的方法来完成此操作吗?


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

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

一个例子。目标文件 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混淆,它是一个动态库linked at runtime.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为静态库编译 SWIG Python 包装器? 的相关文章

随机推荐

  • 将两个 Map 合并为一个 MultiMap

    在 Java 中将两个 Map 组合成一个 Guava MultiMap 的最佳方法是什么 例如 Map1 包含 1 a 和 2 b Map2 包含 2 c 和 3 d 然后生成的组合多重贴图将包含 1 a 2 b c 和 3 d 这是我当
  • 如何在 Angular 中处理空值

    我正在向 Angular 发送数据 但记录的其中一个值 关闭日期 为空 我如何在 Angular 中处理这个问题 以便如果 value 为 null 它会更改为 getDetails this myService getFlowerDeta
  • Android NumberPicker with Formatter 在首次渲染时不会格式化

    我有一个 NumberPicker 它有一个格式化程序 可以在 NumberPicker 旋转或手动输入值时格式化显示的数字 这工作正常 但是当 NumberPicker 首次显示并且我用以下命令初始化它时setValue 0 0 不会被格
  • GCP Dataproc 作业未找到存储在存储桶中的 SSL pem 证书

    我有一个 GCP Dataproc 集群 我正在尝试部署一个 pyspark 作业 该作业使用 SSL 生成一个主题 pem 文件存储在存储桶 gs dataproc kafka code code 中 我正在使用下面所示的代码访问 pem
  • 使用日期的 MongoDB 聚合 $unwind $match - 我错过了什么?

    我是 MongoDB 的新手 我正在尝试使用聚合 我部分地做了我正在寻找的事情 但我对约会有一种奇怪的行为 MongoDB 信息 版本 2 2 0 操作系统 Windows 7 客观的 获取 2012 11 22 之后创建的所有评论 让我们
  • 移动应用程序的后台数据同步

    我们正在数据库之上构建 API 和移动应用程序 该数据库的主表中有数十万条记录 我们的移动开发人员正在努力推动应用程序在本地数据库中预加载完整的表 然后提供一项服务 让手机可以将更改与数据库同步updated at column 虽然这肯定
  • 静态局部变量和静态全局变量有什么区别?

    C 入门 说 每个局部静态变量在第一次之前都会被初始化 执行通过对象的定义 本地静态数据是 函数结束时不会被销毁 当程序运行时它们被销毁 终止 局部静态变量与全局静态变量有什么不同吗 除了申报地点不同之外 还有什么不同呢 void foo
  • 如果通过 setImageURI 设置一次,我如何更新壁画 SimpleDraweeView 的图像

    我正在使用 Facebook Fresco 库和 SimpleDraweeView 来显示文件中的头像图像 Uri avaURI Uri fromFile new File getCacheDir Constants AVA FILE NA
  • AWS cli windows - 在将路径添加到环境变量后仍然收到“'aws'无法识别...”?

    找到以下说明here https stackoverflow com questions 42099986 setting up the path so aws cli works properly 和其他地方 我将 USERPROFILE
  • ORA-12170: TNS: 发生连接超时

    我尝试使用 Oracle Toad 连接到笔记本电脑中的数据库 但仍然出现此错误 ORA 12170 TNS 发生连接超时 我不断出现此错误的可能原因是什么 我昨天访问了同一个数据库并且能够访问它 收集评论里的答案 问题是Oracle服务运
  • R/RStudio、Yosemite 和 Java

    我昨天升级到 OSX Yosemite 当我跑步时library xlsx in RStudio 程序崩溃 我收到消息 要打开 RStudio 您需要安装旧版 Java SE 6 运行时 我得到相同的结果和关于打开的消息R当我跑步时libr
  • jQuery load() 函数不起作用

    我是 JavaScript 世界的新手 我正在尝试使用函数 load 插入另一个 html 文件 解释起来有点困难 代码如下 你能帮助我吗 我没有使用网络服务器 谢谢 为什么它不起作用 浏览器安全限制可能会阻止您使用 A
  • 无法消除我的子图像和父 div 之间奇怪的 2px 空间

    我已经尝试了我所知道的一切 我开始认为它是由 Tumblrs javascript 创建的 首先 我确实有内联块 我知道它们读取空白并添加像素 但经过多次测试 剥离了我所有的 javascript 并删除了所有内容 只留下了一个标准 div
  • 在 WPF 中将项目添加到组合框

    当我向 WPF 窗口添加组合框时 如何向组合框添加项目 Int 设计的 XAML 代码还是在 NameOfWindow xaml cs 文件中 情况 1 您没有数据源 您只需填充ComboBox静态值如下 来自 XAML
  • 在 Pycharm 中过滤记录器控制台输出的简单方法?

    我已经通过该程序命名了我的所有记录器 我想做的是能够通过 Pycharm 中的记录器名称过滤控制台日志输出 可以在不编辑日志配置文件的情况下完成此操作吗 您可以使用以下命令在 PyCharm 的控制台窗口中过滤输出格雷普控制台 https
  • 如何非递归地获取二叉树中叶节点的数量?

    我有一个练习问题被难住了 在不使用递归的情况下获取二叉树中叶节点的数量 我已经四处寻找一些想法 我已经看到了一些想法 例如将节点传递到堆栈 但我不知道当有多个分支时如何做到这一点 任何人都可以提供指针吗 NumberOfLeafNodes
  • 为每个文件运行气流 DAG

    所以我在airflow中有一个非常好的DAG 它基本上在二进制文件上运行几个分析步骤 作为airflow插件实现 DAG 由 ftp 传感器触发 该传感器仅检查 ftp 服务器上是否有新文件 然后启动整个工作流程 所以目前的工作流程是这样的
  • 将数据从浏览器发送到服务器并返回

    我是 C 开发人员 很长一段时间以来我没有真正跟进任何与 Web 相关的开发 我有一个想要实施的项目 实际上是为了赶上这些技术 我的项目是这样的 在浏览器中显示一些内容 例如使用画布和 WebGL 的 3D 场景的内容 在页面上有一个按钮
  • 从出生日期提取的年龄总是出现不一致的情况

    我使用以下代码将用户提供的出生日期转换为当前日期的等效年份 输出在年份中的偏差总是不一致 而在天和月中的偏差则非常大 NSDateFormatter tempFormatter NSDateFormatter alloc init temp
  • 为静态库编译 SWIG Python 包装器?

    这是一个菜鸟问题 我正在尝试学习如何使用 SWIG 为 C 库制作 python 接口 该库是专有的第三方库 它以头文件 foo h 和静态存档 libfoo a 的形式出现在我面前 为了简化问题 我编造了一个我认为具有相同病理学的例子 无