2016-04-26 2 views
1

Я пытаюсь статически связать «библиотеку C++ portaudio» с моим «демо-модулем C++», который является библиотекой (модулем), разрешающей python.Связывание Python/C++, как связать снова статическую библиотеку C++ (portaudio) с distutils?

Я делаю это с 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 

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

/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: ошибка: л.д. возвращается 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.

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

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

Поскольку ваш целевой файл (libdemo.so) является общей библиотекой , вы должны убедиться, что ЛЮБЫЕ коды объектов, включенные внутри, скомпилированы с опцией -fPIC. Чтобы понять, зачем вам этот вариант, обратитесь к: What does -fPIC mean when building a shared library? и Position Independent Code (PIC) in shared libraries

+0

Thx! configure -h показывает все доступные параметры, в конечном итоге мне нужно было «настроить CFLAGS = -fPIC» – Gio

Смежные вопросы