2016-04-26 11 views
1

私は "C++ portaudio library"をpython呼び出し可能ライブラリ(module)である "C++ demo module"と統計的にリンクしようとしています。Python/C++バインディング、distutilsでstatics C++ライブラリ(portaudio)をもう一度リンクする方法は?

私はdistutilsのでこれをやっているし、次のように静的リンクを実行するために、私は、extra_objects引数にlibportaudioを追加しました:

のpython setup.pyのビルド」でコンパイル
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 

/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はを:エラー:ldが、私は明白なことを試してみた。この時点ではそう

1つの終了ステータスを返し、私は」次のように、(上記注extra_compile_argsの=のgccArgs)gccArgsに-fPIC FLAGGを追加しまし:

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引数で再コンパイルする必要があります。独自のコードではありません。そのため、extra_compile_args-fPICを追加することはできません。

いくつかの他のpostsは、ファイルlibportaudio.aportaudioのデフォルトのビルド設定は-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は利用可能なすべてのオプションを表示します。最終的に 'configure CFLAGS = -fPIC' – Gio