如何构建链接静态libbz2库的CPython?
解决CPython编译时静态链接libbz2的问题
问题原因
CPython的configure脚本默认优先检测动态库(.so),即便你在LDFLAGS里指定静态库,部分模块(如bz2)的链接逻辑可能未正确读取全局LDFLAGS,仍会选择动态库。
解决方案
方法1:通过configure变量强制指定静态库
- 清理之前的编译残留:
make distclean
- 重新执行configure,单独为bz2和libffi指定静态库参数:
./configure --prefix=/prj/build/python --disable-shared CFLAGS="-fPIC" LDFLAGS="-L/usr/local/lib64 -L/usr/lib/x86_64-linux-gnu" FFI_LIBS="-l:libffi.a" BZ2_LIBS="-l:libbz2.a"
- 编译并安装:
make && make install
方法2:修改setup.py强制静态链接
如果方法1无效,直接修改CPython源码中的setup.py:
- 打开源码根目录下的
setup.py,搜索_bz2模块的配置部分,找到类似代码:
bz2_module = Extension( '_bz2', sources=['Modules/_bz2module.c'], libraries=['bz2'], )
- 将
libraries=['bz2']替换为libraries=[':libbz2.a'],修改后如下:
bz2_module = Extension( '_bz2', sources=['Modules/_bz2module.c'], libraries=[':libbz2.a'], )
- 保存后重新执行
make && make install
验证结果
编译完成后,检查Python二进制的依赖:
ldd /prj/build/python/bin/python3
如果输出中没有libbz2.so的条目,说明静态链接成功。
内容的提问来源于stack exchange,提问作者Ricardo
相关产品推荐
相关产品推荐

