./python:加载共享库libssl.so.1.1时出错:无法打开共享对象文件:没有那个文件或目录

7
我需要在Ubuntu 16.04中尝试使用预发布的Python 3.7和OpenSSL-1.1.1。按照如下链接中的指南,将OpenSSL与Python进行静态链接:之前的帖子。我下载了opnssl-1.1.1的源代码。然后进入OpenSSL的源代码并执行:
./config
sudo make
sudo make install

然后,编辑Modules/Setup.dist文件,取消以下行的注释:

SSL=/usr/local/ssl
_ssl _ssl.c \
    -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
    -L$(SSL)/lib -lssl -lcrypto

接下来下载python 3.7源代码。然后,进入源代码目录并执行:

./configure
make
make install

在执行make install之后,我在终端输出的末尾得到了以下错误:
./python: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
generate-posix-vars failed
Makefile:596: recipe for target 'pybuilddir.txt' failed
make: *** [pybuilddir.txt] Error 1

我无法弄清楚问题在哪里以及需要做什么。


1
你忘记取消注释 socketmodule.c 中的 _socket,但我认为这并不能解决你的问题。 - user3085931
2
如果你的SSL库位于/usr/local/lib(编译时如果没有传递其他参数,则为默认位置),请确保该位置已经在/etc/ld.so.conf中,并且已经运行了ldconfig来更新缓存以跟踪共享库的位置。 - Charles Duffy
除此之外,检查 ldd 的输出以确定可执行文件无法加载也是有帮助的。 - Charles Duffy
3个回答

7

这与 PythonOpenSSL 版本无关。

Python 构建过程包括一些步骤,当新构建的解释器启动并尝试加载一些新构建的模块时,会涉及到加载一些扩展模块(用 C 写成的实际上是共享对象(.so 文件))。

当加载一个 .so 文件时,加载程序必须递归查找所有该 .so 文件所需的 .so 文件(依赖项),否则它将无法加载。

Python 有一些模块(例如 _ssl*.so_hashlib*.so),它们依赖于 OpenSSLlib。因为您是在 OpenSSL1.1.1 上进行构建的(与系统默认提供的 1.0.* 不同的库名称),因此加载程序无法使用默认库文件。

您需要做的是指示加载程序(详见 [Man7]: LD.SO(8) 获取更多详细信息)在哪里查找“您的” OpenSSL lib(位于 /usr/local/ssl/lib 下)。其中一种方法是在编译 Python 之前将其路径添加到 ${LD_LIBRARY_PATH} 环境变量 中:

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/ssl/lib
./configure
make
make install
你可能还想查看[Python.Docs]: 配置Python - 库选项 (--with-openssl, --with-openssl-rpath)。【值得一读(可能)】:

2
我所做的来解决这个问题:
./configure --with-ssl=./libssl --prefix=/subsystem
sed -i 's!^RUNSHARED=!RUNSHARED=LD_LIBRARY_PATH=/path/to/own/libssl/lib!' Makefile
make
make install

仅使用export设置LD_LIBRARY_PATH是不够的。


我也遇到了使用LD_LIBRARY_PATH导出时的构建错误,而这个Makefile更改对我起了作用。Centos 7,Python 3.10.4。 - Lou K
虽然如此说,但我无法从生成的Python构建中导入ssl。 - Lou K
我曾给这个点赞,但应该给它点踩。stackoverflow不允许我改变我的投票。这种更改的问题在于它会阻止Python的lib-dynload被创建。 - Lou K

-1

使用Python-3.6.5和openssl-1.1.0h,我遇到了同样的问题。我已经取消注释了socketmodule.c中的_socket。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接