python - 将 Python C 扩展链接到另一个库的问题
问题描述
我正在开发 Python 扩展以允许在 Raspberry Pi 上运行的脚本来控制传感器。传感器制造商向我的组织提供了他们的 C API 的源代码,我正在尝试创建一组绑定以使传感器可以在 Python 脚本中访问。
API 源附带的 makefile 创建了一组目标文件,然后我使用以下命令将它们链接到一个库 (libvl53l1.a) 中:
ar -cvq libvl53l1.a *.o
然后,我通过添加此标志将此库添加到我的扩展程序的 setup.py 脚本中:
extra_compile_args=["-l:libvl53l1.a"]
为方便起见,代码、库和 setup.py 脚本当前位于同一目录中。使用命令 (python3 setup.py build_ext --inplace) 将库安装到 Python 中运行没有错误,但是,当我尝试在 Python 解释器中导入我的库时,由于扩展中的未定义符号“VL53L1_WaitDeviceBooted”,导入失败.so 文件。列出 libvl54l1.a 中的符号:
纳米 libvl53l1.a | grep "VL53L1_WaitDeviceBooted"
表明该库确实公开了该名称的符号。因此,我相信链接器无法将扩展链接到这个静态库。我是否缺少导致此问题的步骤?我还尝试按照 Python 文档中的建议删除 .a 扩展名,但无济于事。
谢谢
解决方案
extra_compile_args=["-l:libvl53l1.a"]
此设置添加-l:...
到编译命令,但编译器会忽略该选项,因为它是一个链接选项,并且编译器不执行任何链接。
您想要: extra_link_args=["-lvl53l1"]
,它将添加-lvl53l1
到链接命令(链接器在执行链接时不会忽略该选项)。
推荐阅读
- bash - sftp bash脚本不下载文件
- image - pytorch 中图像和标签的自定义数据加载器。损失函数的输入困难
- r - 读取在 r 的列中有 = 的 excel 文件
- python - 使用 requests.get 下载 rar 文件并将内容写入 python 上的文件问题
- bash - bash循环 - 根据文件中的字符串输出
- python-3.x - plt.show() 在 spyder 3.7(Anaconda 3)中不起作用
- c++ - 可重入 Bison/Flex,如何获取每个 yyscan_t 实例的错误消息
- json - JSON 文件末尾的 , 或 } 请求是什么意思?
- apache-kafka - 是否有一种自动方法来终止写入 KSQL 中的流/表的查询?
- cassandra - cassandra 中的 LOCAL_SERIAL 是什么?