Python ctypes 和动态链接

2024-02-05

我正在用 C 编写一些库,其中包含我想通过 ctypes 从 Python 调用的函数。

我已经在另一个库中成功完成了此操作,但是该库只有非常普通的依赖项(即fstream, math, malloc, stdio, stdlib)。我正在开发的另一个库具有更复杂的依赖关系。

例如,我会尝试使用fftw3。作为测试,我将尝试编译一个简单的.cpp文件包含:

int foo()
{
    void *p  = fftw_malloc( sizeof(fftw_complex)*64 );
    fftw_free(p);

    printf("foo called.\n");

    return 0;
}        

我将其编译为:

icpc -Wall -fPIC -c waveprop.cpp -o libwaveprop.o $std_link
icpc -shared -Wl,-soname,libwaveprop.so.1 -o libwaveprop.so.1.0 libwaveprop.o 

cp waveprop.so.1.0 /usr/local/lib/
rm waveprop.so.1.0
ln -sf /usr/local/lib/waveprop.so.1.0 /usr/local/lib/waveprop.so
ln -sf /usr/local/lib/waveprop.so.1.0 /usr/local/lib/waveprop.so.1

这一切都有效。现在我用另一个测试它.cpp文件包含:

int main()
{
    foo();
}

Result:

icpc test.cpp -lwaveprop 
/lib/../lib64/libwaveprop.so: undefined reference to `fftw_free'
/lib/../lib64/libwaveprop.so: undefined reference to `fftw_malloc'

这是完全合理的。接下来我尝试:

icpc test.cpp -lwaveprop -lfftw3
./a.out
foo called.

伟大的!但现在当我尝试使用 ctypes 加载库时:

>>> from ctypes import *
>>> print cdll.LoadLibrary('/usr/local/lib/libwaveprop.so.1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/ctypes/__init__.py", line 431, in LoadLibrary
    return self._dlltype(name)
  File "/usr/lib64/python2.6/ctypes/__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: /usr/local/lib/libwaveprop.so.1: undefined symbol: fftw_free

所以这是同样的问题,但我不知道如何解决 ctypes 的问题。我尝试了各种方法但没有成功,而且我现在陷入了困境。


好的,谢谢你的帮助。

为了让它工作,我必须在链接时包含依赖项(废话)。我之前尝试过这个,但遇到了错误,所以解决这个问题我必须使用“-fpic”作为 CPP 标志重新编译 fftw。现在一切正常。

icpc -Wall -fPIC -c waveprop.cpp -o libwaveprop.o $std_link
icpc -shared -Wl,-soname,libwaveprop.so.1 -o libwaveprop.so.1.0 libwaveprop.o -lfftw3

cp waveprop.so.1.0 /usr/local/lib/
rm waveprop.so.1.0
ln -sf /usr/local/lib/waveprop.so.1.0 /usr/local/lib/waveprop.so
ln -sf /usr/local/lib/waveprop.so.1.0 /usr/local/lib/waveprop.so.1

谢谢, -缺口

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

Python ctypes 和动态链接 的相关文章

随机推荐

  • 嵌套多级类别的更动态方式

    我正在尝试创建一种方法来检索和显示无数的嵌套类别 现在我可以像这样选择它们 未经测试 不重要 resulttable1 mysql query SELECT name id FROM categories WHERE childof 0 w
  • 在 TabBar 控制的 iOS 应用程序中的第二个选项卡中进行交互时,将 RemoteControlEvents 接收到第一个选项卡

    我正在开发一个带有标签栏控制器的 iOS 应用程序 在第一个选项卡中 我放置了一个 AVQueuePlayer 实例来开始从网络播放音乐 我完成了所有编码以允许通过远程控制事件播放和暂停事件 但只有当我停留在第一个选项卡中时 我才能接收远程
  • 如何将样式应用于嵌入的 SVG?

    当使用 SVG 直接包含在文档中时
  • Mac App开发:“***.app”已损坏且无法打开

    我有一个 Mac 应用程序 我已经有一段时间没有碰过它了 现在 自 macOS Catalina 以来 与 Mac App Store 集成运行应用程序的情况似乎发生了变化 https stackoverflow com q 5867337
  • 如何在 PHP 中 GET 或 POST 多部分数据请求

    我正在从 iOS 发送多部分请求以在服务器上上传图像或文档文件 我的要求就像 UIImage im UIImage imageNamed 57X57 png NSData imageData UIImageJPEGRepresentatio
  • 需要使用范围进行嵌套连接的 ActiveRelation

    我是 Rails 新手 玩得很开心 查询 API 给了我 有些麻烦 我一直在快速地缩放并做很多事情 但这是我第一次花几个小时试图弄清楚 它不像我以前使用过的任何东西 常规 SQL 或 Hibernate 管他呢 我的模型非常简单 私人消息有
  • 是否有用于标头(h1、h2、h3、h4、h5 或 h6)的 jQuery 选择器?

    jQuery 中似乎没有办法判断一个节点是否是标题 即 h1 h2 h3 h4 h5 或 h6 我想写一些类似的东西 hNode node closest h if hNode length gt 0 hNode css padding t
  • random_number() 如何并行工作?

    如何random number 与 OpenMP 并行工作吗 如果我在没有并行化的情况下运行程序 我总是得到相同的结果 但是通过并行化 我每次都会得到不同 但相似 的结果 不保证线程安全或线程性能random number一般来说 Fort
  • 在hadoop java中解析json输入

    我的输入数据位于 hdfs 中 我只是想进行字数统计 但有细微的差别 数据为json格式 所以每行数据为 author foo text hello author foo123 text hello world author foo234
  • 通过链接 2 列设置 R data.table 行顺序

    我试图弄清楚如何根据 2 列的链接对 R 数据表进行排序 这是我的示例数据表 dt lt data table id c A A A A A col1 c 7521 0 7915 5222 5703 col2 c 7907 5703 800
  • CommaIde 上未声明子例程“say”

    我用 CommaIde 打开了这个简单的脚本 usr bin env perl6 my str foobar say str IDE 突出显示单词 say 并显示错误 子程序说未定义 但是 如果我执行该脚本 它运行正常 其他核心方法 如 p
  • 在python中将二进制整数写入文件

    如何在 Python 3 中将整数写入二进制文件 例如 我想将 6277101735386680763835789423176059013767194773182842284081 以恰好 24 个字节的二进制格式写入文件 无符号 我只会使
  • 如果调用 fclose(0),这会关闭标准输入吗?

    如果调用 fclose 0 这会关闭标准输入吗 我问这个问题的原因是由于某种原因 stdin 在我的应用程序中被关闭 我不明白为什么 我检查了 fclose stdin 但这不在应用程序中 所以我想知道 fclose 0 是否会导致未定义的
  • 仍然对 Objective-C 的动态绑定感到困惑

    这个问题来自我刚刚添加到答案中的评论这个问题 https stackoverflow com questions 6608551 question about dynamic binding objective c and methods
  • 看起来我正在实例化这个 SpeechAPI 接口。这怎么可能?

    我在我的项目中使用 Microsoft 文本到文本语音功能 但我对此有一个问题 实际上不是直接的问题 所以 通常程序员在创建接口时 他们会将 I 作为接口名称的前缀 如 IReadable IEnumerator 等 但我遇到过一些让我震惊
  • Unity 2D:区域颜色反转效果

    我正在尝试创建一个 GameObejct 如果处于活动状态 则会反转其后面任何内容的颜色 理想情况下 当该游戏对象出现 变为活动状态时 它会从其中心点扩展到一定大小的半径 因此 想象一个圆 其比例在 1 或 2 秒内逐渐从 x 0 和 y
  • 如何排除模板文字类型的子字符串?

    我想从模板文字类型 自 TypeScript 4 1 起可用 中排除一些子字符串 但我不知道是否可能 Example 我可以定义一个类型说 这个字符串是一个包含 2 个或更多元素的元组 即类似的东西 string number 使用这个文字
  • Symfony 2 - 在 ROLE_USER 下添加用户角色

    我正在尝试在 Symfony 2 中的默认 USER ROLE 下创建一个新角色 该角色对某些功能的写访问权限有限 我正在使用 FOSUserBundle 到目前为止 我已经编写了以下安全设置 但我的 ROLE DEMO 用户仍然获得 RO
  • Rails 时区问题

    这是我的控制台 irb main 048 0 gt Time now gt 2011 04 13 00 51 50 0200
  • Python ctypes 和动态链接

    我正在用 C 编写一些库 其中包含我想通过 ctypes 从 Python 调用的函数 我已经在另一个库中成功完成了此操作 但是该库只有非常普通的依赖项 即fstream math malloc stdio stdlib 我正在开发的另一个