在Python3.6虚拟环境编译mod_wsgi时遇链接错误求助
这个问题我之前碰到过,根源在于你的Python 3.6是静态编译生成的(产出了libpython3.6m.a静态库),而mod_wsgi编译Apache共享模块时,必须依赖动态链接的Python库——静态库在64位系统下无法满足重定位要求,所以才会抛出R_X86_64_32S这类错误。
下面是一步步的解决方法:
解决步骤
1. 重新编译Python 3.6以生成动态链接库
首先得把Python 3.6重新编译一遍,开启动态库支持:
- 如果你没有Python 3.6的源码包,先下载对应版本的源码并解压;如果已经有源码,直接进入源码目录。
- 执行配置命令,注意必须加上
--enable-shared参数,同时通过LDFLAGS指定动态库的运行时路径,避免后续找不到库:
./configure --enable-shared LDFLAGS="-Wl,-rpath=/usr/local/lib" --prefix=/usr/local/python3.6
这里的--prefix可以根据你的实际需求调整,只要是你想安装Python的路径就行。
- 接下来编译并安装:
make && sudo make install
2. 重建Python虚拟环境
之前的虚拟环境依赖的是旧的静态编译Python,所以需要重新创建djangodev虚拟环境:
# 先删除旧环境(如果需要保留环境里的依赖,可以先导出requirements.txt备份) rm -rf /home/fgthct/.virtualenv/djangodev # 用新编译的Python创建虚拟环境 /usr/local/python3.6/bin/python -m venv /home/fgthct/.virtualenv/djangodev # 激活环境 source /home/fgthct/.virtualenv/djangodev/bin/activate
3. 重新编译mod_wsgi
回到mod_wsgi的源码目录,先清理之前的编译残留,再重新配置编译:
# 清理旧的配置和编译文件 make clean && ./configure --with-python=/home/fgthct/.virtualenv/djangodev/bin/python # 编译并安装 make && sudo make install
额外提示
- 确保你使用的mod_wsgi版本支持Python 3.6,建议用4.5.15及以上的版本,旧版本可能存在兼容性问题。
- 重新编译Python后,可以检查
/usr/local/lib下是否有libpython3.6m.so这个动态库,如果系统找不到它,执行sudo ldconfig刷新一下库缓存就行。
内容的提问来源于stack exchange,提问作者fgthct
相关产品推荐
相关产品推荐

