
系统环境:Ubuntu 16.04
编译过程:
sudo apt -y build-dep python3.5 pushd /usr/local/src wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz tar xzf Python-3.7.3.tgz && pushd Python-3.7.3 ./configure --prefix=/usr/local/python37 --enable-shared --enable-optimization --enable-ipv6 --with-pydebug --with-assertions --with-lto make 得到如下输出:
Could not build the ssl module! Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host(). LibreSSL 2.6.4 and earlier do not provide the necessary APIs, https://github.com/libressl-portable/portable/issues/381 根据输出的提示,是系统 openssl 动态库版本过低,但是事实上,ubuntu 16.04 自带 OpenSSL 版本为 1.0.2g ,理论上来说应该满足 Python 的需求,也可以确认:
$ openssl version OpenSSL 1.0.2g 1 Mar 2016 $ apt -y install libssl-dev Reading package lists... Done Building dependency tree Reading state information... Done libssl-dev is already the newest version (1.0.2g-1ubuntu4.15). 通过搜索后我在StackOverflow上得到的答案是:
# OpenSSL 1.0.1g ./config shared --prefix=/my/path --openssldir=/my/path/openssl make make install # Python 3.4 export LDFLAGS="-L/my/path/lib/ -L/my/path/lib64/" export LD_LIBRARY_PATH="/my/path/lib/:/my/path/lib64/" export CPPFLAGS="-I/my/path/include -I/my/path/include/openssl" ./configure --prefix=/my/path/ make make install 现在问题如下:
./configure --help可以看到有一个--with-openssl参数,但我下载 openssl-1.1.1c 源码包后添加该参数生成 Makefile 并进行编译后仍然得到 OpenSSL 版本过低的输出。那么这个--with-openssl参数有何作用?很多其他的程序如 Nginx 通过--with-openssl参数是可以指定静态编译的 OpenSSL 版本的。感谢指点!
1 ysc3839 2019 年 5 月 31 日 via Android 手动编译是有什么特殊需求吗?不能用 pyenv 这种自动编译的脚本吗? |
2 fourstring OP @ysc3839 #1 非常感谢,这个我还真不知道。。。看起来不错 |
3 fourstring OP @ysc3839 #1 不过我还是想知道这样编译问题在哪里 |
4 0ZXYDDu796nVCFxq 2019 年 5 月 31 日 via Android pkg-config --libs libssl 看下链接了哪个库 可能你系统里有多个库 |
5 fourstring OP @gstqc #4 输出只有-lssl 这应该是链接的系统 libssl 吧。 另外执行 dpkg -l | grep libssl 输出如下 ii libssl-dev:amd64 1.0.2g-1ubuntu4.15 amd64 Secure Sockets Layer toolkit - development files ii libssl1.0.0:amd64 1.0.2g-1ubuntu4.15 amd64 Secure Sockets Layer toolkit - shared libraries 这说明我系统只有一个 libssl 库啊 |
6 0ZXYDDu796nVCFxq 2019 年 5 月 31 日 via Android 是否安装了 libressl |
7 fourstring OP @gstqc #6 并没有 |
9 ysc3839 2019 年 5 月 31 日 @fourstring 我没手动编译过,所以也不知道是什么问题…… |
10 ClericPy 2019 年 6 月 1 日 3.7 和 3.6 以前的这个依赖不一样了, 既然都选择 Ubuntu 了, 使用 apt-get install python3.7-dev 就可以了 我给阿里云机器升级的 Ubuntu 18 用的这个方法, 反正 python3-dev 是不够用的 |
11 ysc3839 2019 年 6 月 1 日 via Android @ClericPy Ubuntu 16.04 官方源里面没有 Python 3.7 吧?不过我印象中有个 ppa 源有的。 找到了 https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa |
12 fourstring OP |
13 Kobayashi 2019 年 6 月 3 日 @fourstring 用 Vagrant 下的 Ubuntu 16.04 测试了一下,pyenv 安装 Python 3.7.3。没有出现你所说的问题,一切正常。pyenv 编译很简单,只要确保编译依赖安装齐全。https://github.com/pyenv/pyenv/wiki vagrant@ubuntu-xenial ~ which -a openssl /usr/bin/openssl vagrant@ubuntu-xenial ~ openssl version OpenSSL 1.0.2g 1 Mar 2016 vagrant@ubuntu-xenial ~ pyenv which python /home/vagrant/.local/share/pyenv/versions/3.7.3/bin/python |