Я занимаюсь разработкой расширения Python, позволяющего скрипту, запущенному на Raspberry Pi, управлять датчик. Производитель датчика предоставил моей организации исходный код своего C API, и я пытаюсь создать набор привязок, чтобы сделать датчик доступным в сценариях Python.
Makefile, поставляемый с исходным кодом API, создал набор объектных файлов, которые я затем связал вместе в библиотеку (libvl53l1.a) с помощью команды:
ar -cvq libvl53l1.a * .o
Затем я добавил эту библиотеку в сценарий setup.py моего расширения, добавив этот флаг:
extra_compile_args = ["- l: libvl53l1.a"]
Код, библиотека и сценарий setup.py в настоящее время для удобства находятся в одном каталоге. Установка библиотеки в Python с помощью команды (python3 setup.py build_ext --inplace) выполняется без ошибок, однако, когда я пытаюсь импортировать свою библиотеку в интерпретаторе Python, импорт завершается неудачно из-за неопределенного символа «VL53L1_WaitDeviceBooted» в расширении .so файл. Перечисление символов в libvl54l1.a:
нм libvl53l1.a | grep "VL53L1_WaitDeviceBooted"
показывает, что библиотека действительно предоставляет символ этого имени. Поэтому я считаю, что компоновщик не может связать расширение с этой статической библиотекой. Есть ли какой-то шаг, который вызывает это? Я также попытался удалить расширение .a, как рекомендовано в документации Python, но безрезультатно.
Спасибо
Флаг, о котором я упоминал, является единственным флагом, кроме флагов по умолчанию, используемых Python при компиляции и установке расширений.






extra_compile_args=["-l:libvl53l1.a"]
Этот параметр добавляет -l:... к команде сборник, но компилятор игнорирует этот параметр, потому что это параметр связывание, и компилятор не выполняет связывание.
Вы хотите: extra_link_args=["-lvl53l1"], который добавит -lvl53l1 к команде связывания (компоновщик не проигнорирует эту опцию при выполнении связывания).
Какие флажки отображаются для имени?