2016-04-26 22 views
1

Ich versuche, die "C++ portaudio-Bibliothek" gegen mein "C++ Demo-Modul", das eine Python aufrufbare Bibliothek (Modul) ist, zu verknüpfen.Python/C++ - Bindung, wie man die statische C++ - Bibliothek (Portaudio) mit Distutils verbindet?

Ich tue dies mit distutils, und um die statische Verknüpfung auszuführen, habe ich die libportaudio zum extra_objects Argumente hinzugefügt, wie folgt:

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 

Kompilieren mit „Python setup.py build "Ergebnisse in der folgenden Linkfehler:

/usr/bin/ld: ./clib-3rd-portaudio/libportaudio.a(pa_front.o): Verlagerung R_X86_64_32 gegen` .rodata.str1.8' kann nicht sein, Wird verwendet, wenn ein gemeinsames Objekt erstellt wird; neu kompilieren mit -fPIC ./clib-3rd-portaudio/libportaudio.a: Fehler beim Hinzufügen Symbole: Bad Wert collect2: Fehler: ld returned 1 exit status

Deshalb an dieser Stelle ich das Offensichtliche versucht habe, ich

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

dies führt jedoch in der exakt gleichen Fehler, so dass ich denke, die -fPIC Flag ist nicht die Ursache: die -fPIC flagg zu gccArgs (Anmerkung extra_compile_args = gccArgs oben) wie folgt hinzugefügt haben. Ich vermisse wahrscheinlich etwas Triviales, aber ich bin ein bisschen verloren hier, hoffe, dass jemand helfen kann.

Antwort

1

Wie die Fehlermeldung sagte, sollten Sie die externe Bibliothek libportaudio.a mit Argument, nicht Ihre eigenen Codes neu kompilieren. Deshalb hilft es nicht, -fPIC zu Ihrem extra_compile_args hinzuzufügen.

Mehrere andere posts deuten darauf hin, dass die Datei libportaudio.a nicht bauen gemeinsam genutzte Bibliothek verwendet werden, wahrscheinlich, weil die Standard-Build-Einstellungen von portaudio nicht -fPIC umfassen.

Um die portaudio korrekt neu zu kompilieren, laden Sie die Quelle herunter und versuchen Sie, ./configure mit -shared Option (oder etwas ähnliches) auszuführen. Wenn Sie die richtige Option nicht finden können, ändern Sie das Makefile und hängen Sie an die zusätzlichen Kompilierungsoptionen an. Sie können jede Objektdatei auch manuell kompilieren und in libportaudio.a packen.

Da Ihre Zieldatei (libdemo.so) ist eine Shared Library, Sie sicher, dass Codes Jedes Objekt machen muss innerhalb enthalten sind, mit -fPIC Option kompiliert. Um zu verstehen, warum Sie diese Option benötigen, wenden Sie sich bitte an: What does -fPIC mean when building a shared library? und Position Independent Code (PIC) in shared libraries

+0

Thx! configure -h zeigt alle verfügbaren Optionen an, schließlich musste ich 'CFLAGS = -fPIC' konfigurieren – Gio