Python / C++绑定,如何再次链接静态C ++库(portaudio)与distutils

Python / C++ binding, how to link agains static c++ library (portaudio) with distutils?

本文关键字:portaudio distutils 静态 绑定 C++ 链接 何再次 Python      更新时间:2023-10-16

我正在尝试将"c ++ portaudio library"与我的"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):创建共享对象时不能使用针对".rodata.str1.8"的重定位R_X86_64_32;使用 -fPIC 重新编译./clib-3rd-portaudio/libportaudio.a:添加符号时出错:错误值collect2:错误:ld 返回 1 个退出状态

所以在这一点上我已经尝试了显而易见的方法,我将 -fPIC flagg 添加到 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)