Ubuntu 24.04编译Python3.11缺失libpython3.11.so.1.0问题求助
问题背景
系统为Ubuntu 24.04.1 LTS,已预装python3.12.3及python3-dev。使用以下命令编译安装Python 3.12.7运行正常:
./configure --enable-loadable-sqlite-extensions --enable-optimizations --with-lto=full --enable-shared make make altinstall
但使用相同配置编译Python3.11.10后,运行时出现错误:
python3.11: error while loading shared libraries: libpython3.11.so.1.0: cannot open shared object file: No such file or directory
通过export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib临时解决了问题,但不清楚原因及是否存在配置错误。
原因分析
动态链接库查找机制
Linux系统查找动态链接库时,优先读取LD_LIBRARY_PATH环境变量,其次参考ldconfig维护的系统预加载缓存,最后遍历默认路径。你的默认LD_LIBRARY_PATH为空,因此系统只能依赖缓存和默认路径。
核心问题
你编译的Python 3.11动态库libpython3.11.so.1.0存放在/usr/local/lib,但系统的动态链接库缓存未更新,导致系统无法识别该新库。而Python 3.12能正常运行,大概率是因为安装完成后你曾执行过ldconfig,或者系统自动更新过缓存。
从readelf输出可以看到,Python 3.11和3.12的二进制文件都没有设置RPATH或RUNPATH,因此完全依赖系统的库搜索机制。
解决方案
1. 临时生效(已验证)
通过环境变量临时指定库路径:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
该设置仅在当前终端会话有效,重启后失效。
2. 永久生效(推荐)
方法一:更新系统动态链接库缓存
直接执行以下命令,让系统识别/usr/local/lib下的新库:
sudo ldconfig
执行后无需重启,直接运行python3.11即可正常使用。
方法二:确保/usr/local/lib在系统默认搜索路径中
检查/etc/ld.so.conf或/etc/ld.so.conf.d/目录下的配置文件,确认是否包含/usr/local/lib。如果没有,添加后再执行sudo ldconfig:
echo "/usr/local/lib" | sudo tee -a /etc/ld.so.conf sudo ldconfig
方法三:编译时添加RPATH配置
重新编译Python 3.11时,在configure命令中添加--enable-rpath参数,让Python二进制文件内置库路径:
./configure --enable-loadable-sqlite-extensions --enable-optimizations --with-lto=full --enable-shared --enable-rpath make clean make make altinstall
这样编译后的Python无需依赖系统缓存或环境变量,可直接找到动态库。
验证方法
执行以下命令,确认Python 3.11能正确找到动态库:
ldd /usr/local/bin/python3.11
输出中应包含:
libpython3.11.so.1.0 => /usr/local/lib/libpython3.11.so.1.0
内容的提问来源于stack exchange,提问作者Ge-CDU

