You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 24.04编译Python3.11缺失libpython3.11.so.1.0问题求助

Python 3.11编译后动态库找不到的问题分析

问题背景

系统为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:23:19