返回

Linux 下 Python 源码编译提示 \

Linux

Python 源码编译: 如何解决 "Shared Library files not found" 错误

在 Linux 系统下,以非 root 用户身份从源码编译 Python 时,常常会碰到 "Shared Library files not found" 这个错误信息。错误的根源在于编译 Python 时,系统找不到构建过程中所需的依赖库,例如 OpenSSL 和 libffi。这些库通常安装在系统目录(例如 /usr/lib 或 /usr/local/lib),但如果您使用了自定义安装路径(例如您的 home 目录下的 .local 文件夹),就需要明确告知系统到哪里去寻找。

出现这个问题的原因在于 Python 的一些核心模块,例如 _ssl_hashlib_ctypes,依赖于这些外部库。当您以非 root 用户身份编译 Python 时,默认的搜索路径往往不包含您的自定义安装路径,导致编译器无法找到所需的库文件。

解决这个问题的关键在于在编译 Python 时,通过设置环境变量和配置构建选项,明确告知系统到哪里去寻找 OpenSSL 和 libffi 这些外部库。

首先,您需要设置几个关键的环境变量,告诉系统和编译器到哪里去寻找库文件和头文件。

export LD_LIBRARY_PATH=$HOME/.local/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=$HOME/.local/lib:$LIBRARY_PATH
export CFLAGS="-I$HOME/.local/include"
export LDFLAGS="-L$HOME/.local/lib -L$HOME/.local/lib64" 
  • LD_LIBRARY_PATH:这个环境变量告诉系统在运行时到哪里去寻找共享库。
  • LIBRARY_PATH: 这个环境变量告诉编译器在链接时到哪里去寻找库文件。
  • CFLAGS: 这个环境变量告诉编译器到哪里去寻找头文件。
  • LDFLAGS: 这个环境变量告诉链接器到哪里去寻找库文件。

请确保将 $HOME/.local 替换为您实际安装 OpenSSL 和 libffi 的路径。

接下来,您需要配置 Python 构建,告诉它 OpenSSL 和 libffi 的安装路径。

./configure --enable-optimizations --with-lto --with-openssl=$HOME/.local --prefix=$HOME/.local 

在这个命令中:

  • --enable-optimizations 启用编译优化,提高 Python 运行效率。
  • --with-lto 启用链接时优化,进一步提升性能。
  • --with-openssl=$HOME/.local 明确指定 OpenSSL 的安装路径。
  • --prefix=$HOME/.local 指定 Python 的安装路径,方便管理。

完成配置后,就可以开始构建和安装 Python 了。

make 
make install

安装完成后,为了确保 Python 能够正确链接到 OpenSSL 和 libffi,您可以进行一些简单的验证。

>>> import ssl
>>> import hashlib
>>> import ctypes

如果在导入这些模块时没有出现错误信息,就说明 Python 已经成功链接到了所需的外部库。

常见问题及解答

  1. 问:设置了环境变量后,为什么编译时还是提示找不到库文件?

    答: 请确保您设置的环境变量在启动新的终端窗口后仍然有效。您可以使用 echo $LD_LIBRARY_PATH 等命令检查环境变量的值。

  2. 问:除了设置环境变量,还有其他方法指定库文件路径吗?

    答: 是的,您可以在编译时使用 -L 选项指定库文件路径,例如 gcc -L/path/to/lib -lssl -o myprogram

  3. 问:如何确定系统中安装了哪些版本的 OpenSSL 和 libffi?

    答: 您可以使用 openssl versionpkg-config --modversion libffi 命令查看 OpenSSL 和 libffi 的版本信息。

  4. 问:如果我的系统中没有安装 OpenSSL 或 libffi,该如何安装?

    答: 您可以从 OpenSSL 和 libffi 的官方网站下载源码,然后手动编译安装,或者使用系统提供的包管理器进行安装。

  5. 问:为什么需要使用 --prefix=$HOME/.local 选项指定 Python 的安装路径?

    答: 将 Python 安装到用户目录下,可以避免对系统造成不必要的更改,方便管理和卸载,也更适合非 root 用户进行操作。

通过本文提供的解决方案,您应该能够解决 Python 源码编译过程中遇到的 "Shared Library files not found" 错误。如果您还有其他问题,请随时提出。