簡體   English   中英

Python / C++ 綁定,如何使用 distutils 重新鏈接靜態 C++ 庫(portaudio)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM