我试图将“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标志不是根本原因。我可能错过了一些微不足道的东西,但我在这里有点失落,希望有人可以提供帮助。
答案 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