繁体   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