树莓派3b+ centos7 编译安装python3.7.0

本文详细介绍了在Linux环境下从源码编译安装Python3.7的过程,包括必要的依赖库安装、libressl配置、uuid模块修改等步骤,并提供了遇到的典型错误及其解决方案,如libffi缺失、uuid_t类型冲突、动态链接库加载失败等问题。

1、安装相关库

yum -y install zlib zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel 
yum -y tk-devel gdbm-devel db4-devel libpcap-devel xz-devel wget
yum -y install gcc kernel-devel kenel-headers make bzip2 libffi libffi-devel
yum -y install expat-devel e2fsprogs-devel uuid-devel libuuid-devel tcl
yum -y install gdbm-devel tcl-devel tk-devel python-tools

2、安装libressl

官网:https://www.libressl.org/, 西寨速度比较慢,采用镜像地址

wget http://ftp.jaist.ac.jp/pub/OpenBSD/LibreSSL/libressl-2.8.2.tar.gz
tar xzvf libressl-2.8.2.tar.gz
cd libressl-2.8.2
./configure --prefix=/usr/local/ssl 
make
sudo make install
sudo mv /usr/bin/openssl /usr/bin/openssl.bak 
sudo mv /usr/include/openssl /usr/include/openssl.bak 
sudo ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl 
sudo ln -s /usr/local/ssl/include/openssl /usr/include/openssl

sudo echo /usr/local/ssl/lib > /etc/ld.so.conf.d/libressl-2.8.0.conf
sudo ldconfig -v #重新加载库文件

3、下载python3.7.0并解包

wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
tar xzvf Python-3.7.0.tgz
export LDFLAGS="-L/usr/local/ssl/lib"
export CPPFLAGS="-I/usr/local/ssl/include"
export PKG_CONFIG_PATH="/usr/local/ssl/lib/pkgconfig"

cd Python-3.7.0

4、修改uuid相关文件,否则编译报错

vi ./Modules/_uuidmodule.c

将如下内容

#define PY_SSIZE_T_CLEAN

#include "Python.h"
#ifdef HAVE_UUID_UUID_H
#include <uuid/uuid.h>
#endif
#ifdef HAVE_UUID_H
#include <uuid.h>
#endif

修改为

#define PY_SSIZE_T_CLEAN

#include "Python.h"
#ifdef HAVE_UUID_UUID_H
#include <uuid/uuid.h>
// #endif
// #ifdef HAVE_UUID_H
#else
#include <uuid.h>
#endif

5、编译python3.7.0并安装

export LDFLAGS="-L/usr/local/ssl/lib"
export CPPFLAGS="-I/usr/local/ssl/include"
export PKG_CONFIG_PATH="/usr/local/ssl/lib/pkgconfig"

# ./configure --prefix=/usr/local/python370 --enable-optimizations --with-uuid=ossp --enable-shared CFLAGS=-fPIC 

./configure --prefix=/usr/local/python370 --enable-optimizations --with-uuid=ossp CFLAGS=-fPIC 
make
sudo make install

sudo ln -s /usr/local/python370/bin/python3.7 /usr/bin/python3.7.0 
sudo ln -s /usr/local/python370/bin/python3.7 /usr/bin/python370 
sudo ln -s /usr/local/python370/bin/pip3.7 /usr/bin/pip3.7.0
sudo ln -s /usr/local/python370/bin/pip3.7 /usr/bin/pip370

5.1编译python3.7.0并安装命令汇总:

export LDFLAGS="-L/usr/local/ssl/lib"
export CPPFLAGS="-I/usr/local/ssl/include"
export PKG_CONFIG_PATH="/usr/local/ssl/lib/pkgconfig"

wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
tar xzvf Python-3.7.0.tgz
cd Python-3.7.0
sed -i "6s/endif/else/" ./Modules/_uuidmodule.c
sed -i "7d" ./Modules/_uuidmodule.c
sed -i "s/Werror=implicit-function-declaration/Wno-error/g" ./configure

./configure --prefix=/usr/local/python370 --enable-optimizations --with-uuid=ossp CFLAGS=-fPIC 
make
sudo make install

sudo ln -s /usr/local/python370/bin/python3.7 /usr/bin/python3.7.0 
sudo ln -s /usr/local/python370/bin/python3.7 /usr/bin/python370 
sudo ln -s /usr/local/python370/bin/pip3.7 /usr/bin/pip3.7.0
sudo ln -s /usr/local/python370/bin/pip3.7 /usr/bin/pip370

5.2编译python3.7.1并安装命令汇总:

export LDFLAGS="-L/usr/local/ssl/lib"
export CPPFLAGS="-I/usr/local/ssl/include"
export PKG_CONFIG_PATH="/usr/local/ssl/lib/pkgconfig"

wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz
tar xzvf Python-3.7.1.tgz
cd Python-3.7.1
sed -i "6s/endif/else/" ./Modules/_uuidmodule.c
sed -i "7d" ./Modules/_uuidmodule.c
sed -i "s/Werror=implicit-function-declaration/Wno-error/g" ./configure

./configure --prefix=/usr/local/python371 --enable-optimizations --with-uuid=ossp CFLAGS=-fPIC 
make
sudo make install

sudo ln -s /usr/local/python371/bin/python3.7 /usr/bin/python3.7.1 
sudo ln -s /usr/local/python371/bin/python3.7 /usr/bin/python371 
sudo ln -s /usr/local/python371/bin/pip3.7 /usr/bin/pip3.7.1
sudo ln -s /usr/local/python371/bin/pip3.7 /usr/bin/pip371

6、遇到的问题一

INFO: Could not locate ffi libs and/or headers

Python build finished successfully!
The necessary bits to build these optional modules were not found:
_hashlib              _ssl                  _uuid              
To find the necessary bits, look in setup.py in detect_modules() for the module's name.


The following modules found by detect_modules() in setup.py, have been
built by the Makefile instead, as configured by the Setup files:
_abc                  atexit                pwd                
time                                                           


Failed to build these modules:
_ctypes                                                        


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
 

7、遇到问题2

问题:

 gcc -pthread -fPIC -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fprofile-generate -I./Include -I. -I/usr/local/ssl/include -I/usr/local/include -I/home/pi/my/Python-3.7.0/Include -I/home/pi/my/Python-3.7.0 -c /home/pi/my/Python-3.7.0/Modules/_uuidmodule.c -o build/temp.linux-aarch64-3.7/home/pi/my/Python-3.7.0/Modules/_uuidmodule.o -DHAVE_UUID_UUID_H
In file included from /home/pi/my/Python-3.7.0/Modules/_uuidmodule.c:8:0:
/usr/include/uuid.h:94:24: error: conflicting types for ‘uuid_t’
 typedef struct uuid_st uuid_t;
                        ^
In file included from /home/pi/my/Python-3.7.0/Modules/_uuidmodule.c:5:0:
/usr/include/uuid/uuid.h:44:23: note: previous declaration of ‘uuid_t’ was here
 typedef unsigned char uuid_t[16];
                       ^
In file included from /home/pi/my/Python-3.7.0/Modules/_uuidmodule.c:8:0:
/usr/include/uuid.h:107:22: error: conflicting types for ‘uuid_compare’
 extern uuid_rc_t     uuid_compare  (const uuid_t  *_uuid, const uuid_t *_uuid2, int *_result);
                      ^
In file included from /home/pi/my/Python-3.7.0/Modules/_uuidmodule.c:5:0:
/usr/include/uuid/uuid.h:73:5: note: previous declaration of ‘uuid_compare’ was here
 int uuid_compare(const uuid_t uu1, const uuid_t uu2);
     ^
/home/pi/my/Python-3.7.0/Modules/_uuidmodule.c: In function ‘py_uuid_generate_time_safe’:
/home/pi/my/Python-3.7.0/Modules/_uuidmodule.c:15:12: error: storage size of ‘uuid’ isn’t known
     uuid_t uuid;
            ^
/home/pi/my/Python-3.7.0/Modules/_uuidmodule.c:15:12: warning: unused variable ‘uuid’ [-Wunused-variable]
/home/pi/my/Python-3.7.0/Modules/_uuidmodule.c:35:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^ gcc -pthread -fPIC -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fprofile-generate -I./Include -I. -I/usr/local/ssl/include -I/usr/local/include -I/home/pi/my/Python-3.7.0/Include -I/home/pi/my/Python-3.7.0 -c /home/pi/my/Python-3.7.0/Modules/_uuidmodule.c -o build/temp.linux-aarch64-3.7/home/pi/my/Python-3.7.0/Modules/_uuidmodule.o -DHAVE_UUID_UUID_H
In file included from /home/pi/my/Python-3.7.0/Modules/_uuidmodule.c:8:0:
/usr/include/uuid.h:94:24: error: conflicting types for ‘uuid_t’
 typedef struct uuid_st uuid_t;
                        ^
In file included from /home/pi/my/Python-3.7.0/Modules/_uuidmodule.c:5:0:
/usr/include/uuid/uuid.h:44:23: note: previous declaration of ‘uuid_t’ was here
 typedef unsigned char uuid_t[16];
                       ^
In file included from /home/pi/my/Python-3.7.0/Modules/_uuidmodule.c:8:0:
/usr/include/uuid.h:107:22: error: conflicting types for ‘uuid_compare’
 extern uuid_rc_t     uuid_compare  (const uuid_t  *_uuid, const uuid_t *_uuid2, int *_result);
                      ^
In file included from /home/pi/my/Python-3.7.0/Modules/_uuidmodule.c:5:0:
/usr/include/uuid/uuid.h:73:5: note: previous declaration of ‘uuid_compare’ was here
 int uuid_compare(const uuid_t uu1, const uuid_t uu2);
     ^
/home/pi/my/Python-3.7.0/Modules/_uuidmodule.c: In function ‘py_uuid_generate_time_safe’:
/home/pi/my/Python-3.7.0/Modules/_uuidmodule.c:15:12: error: storage size of ‘uuid’ isn’t known
     uuid_t uuid;
            ^
/home/pi/my/Python-3.7.0/Modules/_uuidmodule.c:15:12: warning: unused variable ‘uuid’ [-Wunused-variable]
/home/pi/my/Python-3.7.0/Modules/_uuidmodule.c:35:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
 解决参加4步

8、问题3:python3: error while loading shared libraries: libpython3.7m.so.1.0: cannot open shared object file

采用:--enable-shared 方式会出现“python3: error while loading shared libraries: libpython3.5m.so.1.0: cannot open shared object file”

去掉该选项

 

参考资料:

https://blog.youkuaiyun.com/love_cjiajia/article/details/82254371

转载于:https://my.oschina.net/mengyoufengyu/blog/2249877

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值