Python / C ++绑定,如何将dists静态c ++库(portaudio)与distutils链接起来?

时间:2016-04-26 22:46:10

标签: python c++ 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 / libaudaudio.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标志不是根本原因。我可能错过了一些微不足道的东西,但我在这里有点失落,希望有人可以提供帮助。

1 个答案:

答案 0 :(得分:1)

正如错误消息所述,您应该使用-fPIC参数重新编译外部库 libportaudio.a ,而不是您自己的代码。这就是为什么它无法将-fPIC添加到您的extra_compile_args

其他几个posts建议文件libportaudio.a不能用于构建共享库,可能是因为portaudio的默认构建设置不包含-fPIC。< / p>

要正确重新编译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