[英]Python / C++ binding, how to link agains static c++ library (portaudio) with distutils?
我試圖將“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): relocation 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 標志不是根本原因。 我可能遺漏了一些微不足道的東西,但我在這里有點迷茫,希望有人能幫忙。
正如錯誤消息所說,您應該使用-fPIC
參數重新編譯外部庫libportaudio.a ,而不是您自己的代碼。 這就是為什么將-fPIC
添加到您的extra_compile_args
沒有幫助的原因。
其他幾篇文章表明文件libportaudio.a
不能用於構建共享庫,可能是因為portaudio
的默認構建設置不包括-fPIC
。
要正確重新編譯portaudio
,請下載源代碼並嘗試使用-shared
選項(或類似選項)運行./configure
。 如果找不到合適的選項,請修改 Makefile 並將-fPIC
附加到額外的編譯選項。 您也可以手動編譯每個目標文件並將它們打包到 libportaudio.a 中。
由於您的目標文件 (libdemo.so) 是一個共享庫,您必須確保其中包含的任何目標代碼都使用-fPIC
選項進行編譯。 要了解為什么需要此選項,請參閱: 構建共享庫時 -fPIC 的含義是什么? 共享庫中的位置無關代碼 (PIC)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.