将 Python C 扩展链接到另一个库时出现问题
Issue with Linking Python C Extension to Another Library
我正在开发 Python 扩展以允许 Raspberry Pi 上的脚本 运行 控制 sensor。传感器制造商向我的组织提供了他们的 C API 的源代码,我正在尝试创建一组绑定以使传感器可以在 Python 脚本中访问。
API 源代码附带的 makefile 创建了一组目标文件,然后我使用以下命令将它们 link 编辑到一个库 (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 解释器,由于扩展的 .so 文件中的未定义符号 "VL53L1_WaitDeviceBooted",导入失败。列出 libvl54l1.a 中的符号:
纳米 libvl53l1.a | grep "VL53L1_WaitDeviceBooted"
表明该库确实公开了这个名称的符号。因此,我认为 linker 未能 link 使用此静态库进行扩展。我是否缺少导致此问题的步骤?我还尝试按照 Python 文档中的建议删除 .a 扩展名,但无济于事。
谢谢
extra_compile_args=["-l:libvl53l1.a"]
此设置将 -l:...
添加到 compilation 命令,但编译器 忽略 该选项,因为它是一个 linking 选项,编译器不执行 linking。
您想要:extra_link_args=["-lvl53l1"]
,这会将 -lvl53l1
添加到 link 命令(link 用户在执行 [=25] 时不会忽略该选项=]ing).
我正在开发 Python 扩展以允许 Raspberry Pi 上的脚本 运行 控制 sensor。传感器制造商向我的组织提供了他们的 C API 的源代码,我正在尝试创建一组绑定以使传感器可以在 Python 脚本中访问。
API 源代码附带的 makefile 创建了一组目标文件,然后我使用以下命令将它们 link 编辑到一个库 (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 解释器,由于扩展的 .so 文件中的未定义符号 "VL53L1_WaitDeviceBooted",导入失败。列出 libvl54l1.a 中的符号:
纳米 libvl53l1.a | grep "VL53L1_WaitDeviceBooted"
表明该库确实公开了这个名称的符号。因此,我认为 linker 未能 link 使用此静态库进行扩展。我是否缺少导致此问题的步骤?我还尝试按照 Python 文档中的建议删除 .a 扩展名,但无济于事。
谢谢
extra_compile_args=["-l:libvl53l1.a"]
此设置将 -l:...
添加到 compilation 命令,但编译器 忽略 该选项,因为它是一个 linking 选项,编译器不执行 linking。
您想要:extra_link_args=["-lvl53l1"]
,这会将 -lvl53l1
添加到 link 命令(link 用户在执行 [=25] 时不会忽略该选项=]ing).