Python / C++绑定,如何再次链接静态C ++库(portaudio)与distutils
Python / C++ binding, how to link agains static c++ library (portaudio) with distutils?
我正在尝试将"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)
- 通过Python Distutils(用于Python C扩展)使用可重定位的设备代码编译CUDA代码
- 对Portaudio中错误的未定义引用
- Portaudio回调不是连续的
- 从Portaudio到WebRTC :: AudioProcessing馈送输入流
- 使用Portaudio记录音频
- Portaudio:通过调用功能播放多个生成的声音
- Sonarqube build wrapper for distutils
- 在 Anaconda 中构建 Boost Extension with distutils 和 Microsoft Vi
- 无法为 i386 构建 PortAudio 以使其与 NI 的 DAQmxBase 配合良好
- 阻止portaudio中的I/O
- python distutils 不包括 SWIG 生成的模块
- 将 Opus 与 PortAudio 结合使用
- 使用portaudio和sndfile播放wav文件
- Python / C++绑定,如何再次链接静态C ++库(portaudio)与distutils
- 错误:distutils 扩展模块中'.hpp'未知文件类型
- Cython:使用distutils编译C++
- 用于ARM体系结构的交叉编译portaudio
- 如何在Windows上有效使用PortAudio Pa_OpenStream()
- PortAudio示例代码问题
- Portaudio回调函数示例