2016-04-26 68 views
1

我想staticaly鏈接「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:錯誤: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

其他幾個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!配置-h顯示所有可用的選項,最終我必須做的是'configure CFLAGS = -fPIC' – Gio