Связывание Python / C ++, как связать статическую библиотеку c ++ (portaudio) с distutils?

Я пытаюсь статически связать «библиотеку c ++ portaudio» с моим «демонстрационным модулем C ++», который является вызываемой библиотекой (модулем) Python.

Я делаю это с помощью distutils, и для статического связывания я добавил libportaudio в аргумент extra_objects следующим образом:

module1 = Extension(
"demo",
sources=cppc,
# TODO remove os dependency
extra_compile_args=gccArgs,
# link against shared libraries
#libraries=[""]
# link against static libraries
extra_objects=["./clib-3rd-portaudio/libportaudio.a"]) # << I've added the static lib here

Компиляция с «python setup.py build» приводит к следующей ошибке компоновщика:

/ usr / bin / ld: ./clib-3rd-portaudio/libportaudio.a(pa_front.o): перемещение R_X86_64_32 против `.rodata.str1.8 ‘нельзя использовать при создании общего объекта; перекомпилировать с -fPIC
./clib-3rd-portaudio/libportaudio.a: ошибка при добавлении символов: неверное значение
collect2: error: ld вернул 1 состояние выхода

Итак, в этот момент я попробовал очевидное, я добавил флаг -fPIC в gccArgs (обратите внимание на extra_compile_args = gccArgs выше) следующим образом:

gccArgs = [
"-Icsrc",
"-Icsrc/paExamples",
"-Icinc-3rd-portaudio",
"-Icinc-3rd-portaudio/common",
"-Icinc-3rd-portaudio/linux",
"-fPIC"] # << I've added the -fPIC flag here

Однако это приводит к точно такой же ошибке, поэтому я полагаю, что флаг -fPIC не является основной причиной. Я, вероятно, упускаю что-то тривиальное, но я немного потерян здесь, надеюсь, кто-нибудь может помочь.

1

Решение

Как говорится в сообщении об ошибке, вы должны перекомпилировать внешнюю библиотеку libportaudio.a с -fPIC аргумент, а не ваши собственные коды. Вот почему это не помогает добавить -fPIC на ваш extra_compile_args,

Несколько других сообщений предположить, что файл libportaudio.a не может быть использован для создания общей библиотеки, вероятно, потому что настройки сборки по умолчанию portaudio не включать -fPIC,

Перекомпилировать portaudio правильно, скачайте исходник и попробуйте запустить ./configure с -shared вариант (или что-то подобное). Если вы не можете найти нужную опцию, измените Makefile и добавьте -fPIC к дополнительным опциям компиляции. Вы также можете скомпилировать каждый объектный файл вручную и упаковать их в libportaudio.a.

Поскольку ваш целевой файл (libdemo.so) является общая библиотека, Вы должны убедиться, что ЛЮБЫЕ объектные коды, включенные внутри, скомпилированы с -fPIC вариант. Чтобы понять, почему вам нужна эта опция, пожалуйста, обратитесь к:
Что означает -fPIC при создании разделяемой библиотеки? а также Независимый код позиции (PIC) в общих библиотеках

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]