【问题标题】:Issue with Linking Python C Extension to Another Library将 Python C 扩展链接到另一个库的问题
【发布时间】:2018-12-09 03:43:50
【问题描述】:

我正在开发 Python 扩展,以允许在 Raspberry Pi 上运行的脚本控制sensor。传感器制造商向我的组织提供了他们的 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 中的符号:

nm libvl53l1.a | grep "VL53L1_WaitDeviceBooted"

表明该库确实公开了该名称的符号。因此,我相信链接器无法将扩展链接到这个静态库。我是否缺少导致此问题的步骤?我还尝试按照 Python 文档中的建议删除 .a 扩展名,但无济于事。

谢谢

【问题讨论】:

  • 该名称显示了哪些标志?
  • 我提到的标志是Python在编译和安装扩展时使用的默认标志之外唯一的标志。

标签: python c linker object-files python-extensions


【解决方案1】:

extra_compile_args=["-l:libvl53l1.a"]

此设置将-l:... 添加到编译命令,但编译器忽略该选项,因为它是一个链接选项,并且没有链接由编译器完成。

你想要:extra_link_args=["-lvl53l1"],它将-lvl53l1 添加到链接命令中(链接器在执行链接时不会忽略该选项)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    相关资源
    最近更新 更多