Я пытаюсь статически связать «библиотеку 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 не является основной причиной. Я, вероятно, упускаю что-то тривиальное, но я немного потерян здесь, надеюсь, кто-нибудь может помочь.
Как говорится в сообщении об ошибке, вы должны перекомпилировать внешнюю библиотеку libportaudio.a с -fPIC
аргумент, а не ваши собственные коды. Вот почему это не помогает добавить -fPIC
на ваш extra_compile_args
,
Несколько других сообщений предположить, что файл libportaudio.a
не может быть использован для создания общей библиотеки, вероятно, потому что настройки сборки по умолчанию portaudio
не включать -fPIC
,
Перекомпилировать portaudio
правильно, скачайте исходник и попробуйте запустить ./configure
с -shared
вариант (или что-то подобное). Если вы не можете найти нужную опцию, измените Makefile и добавьте -fPIC
к дополнительным опциям компиляции. Вы также можете скомпилировать каждый объектный файл вручную и упаковать их в libportaudio.a.
Поскольку ваш целевой файл (libdemo.so) является общая библиотека, Вы должны убедиться, что ЛЮБЫЕ объектные коды, включенные внутри, скомпилированы с -fPIC
вариант. Чтобы понять, почему вам нужна эта опция, пожалуйста, обратитесь к:
Что означает -fPIC при создании разделяемой библиотеки? а также Независимый код позиции (PIC) в общих библиотеках
Других решений пока нет …