交叉编译Python3.8

1. 交叉编译python

工程组织:根目录设置为/home/a123/xxx/tools/4python

内容创作不易,对您有帮助的话,可以支持打赏一下下

配置脚本统一命名为conig_arm/pc_<package>.sh

交叉编译出的头文件以及动态库文件统一放在cross_compile_dependency目录下面

直接编译出的PC版python放在python_pc文件夹

交叉编译出的Arm版Python放在python_arm文件夹

其他的源码包均解压在当前目录下

说明:

编译出arm版的python宏观上需要进行2个步骤

1、编译pc版的Python

2、编译arm版的python

其中,第2步,直接编译又会缺少很多包,在编译出比较完整arm版的python,又需要下载很多源码包。

所有的源码打包到了以下链接

交叉编译源码_数据集-飞桨AI Studio星河社区

1.1. 编译pc版的python

1.1.1. 配置

进入到Python-3.8.19文件夹,执行以下命令

./configure --prefix=$(pwd)/build_pc

1.1.2. 编译

然后进行先不要编译,因为会出现以下结果,除非你确定不需要一些可选的模块

这些信息表明在编译Python时,有一些可选模块没有找到必要的依赖库,因此没有被编译。这些模块包括_bz2、_curses、_curses_panel、_dbm、_gdbm、_lzma、_sqlite3、_tkinter、_uuid和readline。这些模块的缺失通常是因为系统中缺少相应的开发库。后边如果使用到这些库,就会报错

可以使用以下命令,安装这些依赖库

sudo apt-get update
sudo apt-get install libbz2-dev libncurses5-dev libncursesw5-dev libgdbm-dev liblzma-dev libsqlite3-dev tk-dev uuid-dev libreadline-dev libgdbm-compat-dev

安装之后,重新配置和编译python

#!/bin/bash

PYTHON_HOME=/home/a123/xxx/tools/4python/Python-3.8.6
CURRENT_HOME=$(pwd)

cd $PYTHON_HOME
make clean

# setup install path
USR_PREFIX=$CURRENT_HOME/python_pc

# configure python build environment
$PYTHON_HOME/configure --prefix=$USR_PREFIX
# make -j 4
# make install 

然后新开一个命令行,切换到PYTHON_HOME下面,执行

# 不太熟悉的话,一步一步执行,直接执行所有的代码,可能会忽略一些报错信息
make -j 4

已经成功编译了所有的代码,没有出现filed

1.1.3. 安装

接着make之后的操作

make install

可以观察到已经成功安装了

1.2. 交叉编译openssl

解压openssl的源码

进行工程根目录下面配置,并执行

#!/bin/bash

PACKAGE_HOME=/home/a123/xxx/tools/4python/openssl-1.1.1i
CURRENT_HOME=$(pwd)

 cd $PACKAGE_HOME
 make clean

 # setup install path
 USR_PREFIX=$CURRENT_HOME/cross_compile_dependency

 # configure openssl build environment

 $PACKAGE_HOME/config \
  --prefix=$USR_PREFIX  \
  --cross-compile-prefix=arm-linux-gnueabi-  \
  no-asm \
  shared \
  no-async
 # make -j 4
 # make install

no-asm 关于汇编的模块不要编译
shared 编译成动态链接库
no-async 不编译异步相关函数
--prefix=xxxx 安装路径,自己设置好,先建个文件夹好一点
--cross-compile-prefix=xxx 交叉编译工具的路径及前缀

接下来直接make会报错

解决方法:打开MakeFile文件,搜索查找m64,有两处,删掉它(我这是已经删掉了)

(记得切换到openssl源码所在的文件夹,)然后 make,然后make install

1.3. 交叉编译zlib

  1. 在工程根目录解压zlib源码

  2. 在工程根目录编写脚本,并执行

    #!/bin/bash

    ZLIB_HOME=/home/a123/xxx/tools/4python/zlib/zlib-1.3.1
    CURRENT_HOME=$(pwd)

    setup install path

    USR_PREFIX=$CURRENT_HOME/cross_compile_dependency
    cd $ZLIB_HOME
    make clean

    configure zlib build environment

    export CC=arm-linux-gnueabi-gcc
    export RANLIB=arm-linux-gnueabi-ranlib
    export AR=arm-linux-gnueabi-ar

    ZLIB_HOME/configure \ --prefix=USR_PREFIX
    --enable-shared

    make -j 4

    make install

  3. 编译(记得先切换到zlib源码目录)

    make -j n # n代表线程数量,根据自己电脑配置进行修改

  4. 安装

    make install

1.4. 交叉编译libffi

1、在工程根目录解压libffi源码

2、在工程根目录编写脚本,并执行

#!/bin/bash

PACKAGE_HOME=/home/a123/xxx/tools/4python/libffi-3.3
CURRENT_HOME=$(pwd)

 cd $PACKAGE_HOME
 make clean

 # setup install path
 USR_PREFIX=$CURRENT_HOME/cross_compile_dependency

 # configure openssl build environment
 export CC=arm-linux-gnueabi-gcc


 $PACKAGE_HOME/configure \
  --prefix=$USR_PREFIX  \
  --host=arm-linux-gnueabi \
  --build=x86_64-linux-gnu \
  --target=arm-linux-gnueabi
 # make -j 4
 # make install
  1. 编译(切换到libffi源码目录中)

    make -j4

  2. 安装

    make install

1.5. 交叉编译bz2

1、在工程根目录解码bzip2的源码

2、进入bzip2源码目录进行以下操作

2.1、修改Makefile文件

#SHELL=/bin/sh
SHELL=/bin/bash

# To assist in cross-compiling
# CC=gcc
# AR=ar
# RANLIB=ranlib
# LDFLAGS=
CC=arm-linux-gnueabihf-gcc -fPIC # -fPIC也得有,要不会报错
AR=arm-linux-gnueabihf-ar
RANLIB=arm-linux-gnueabihf-ranlib
LDFLAGS=

BIGFILES=-D_FILE_OFFSET_BITS=64
CFLAGS=-Wall -Winline -O2 -g $(BIGFILES)

# Where you want it installed when you do 'make install'
# PREFIX=/usr/local
PREFIX=/home/a123/xxx/tools/4python/cross_compile_dependency

# 还有把下边的test相关的内容注释掉,否则编译不能通过

然后 make

然后 make install即可

1.6. 交叉编译sqlite3

1、在工程根目录下解压sqlite的压缩包

2、在工程根目录下配置脚本,并执行

#!/bin/bash

PACKAGE_HOME=/home/a123/xxx/tools/4python/sqlite-autoconf-3460100
CURRENT_HOME=$(pwd)

 cd $PACKAGE_HOME
 make clean

 # setup install path
 USR_PREFIX=$CURRENT_HOME/cross_compile_dependency

 # configure sqlite3 build environment
export CC=arm-linux-gnueabi-gcc
 $PACKAGE_HOME/configure \
  --prefix=$USR_PREFIX  \
  --host=arm-linux-gnueabi \
  --build=x86_64-linux-gnu \
  --target=arm-linux-gnueabi 
 # make -j 4
 # make install

然后进入sqlite源码目录中,进行make 和make install

1.7. 交叉编译curses和curses_panel

1、在工程目录下解压ncurses压缩包

2、在工程根目录下配置文件

#!/bin/bash

PACKAGE_HOME=/home/a123/xxx/tools/4python/ncurses-6.5
CURRENT_HOME=$(pwd)
PREFIX_PATH=$CURRENT_HOME/cross_compile_dependency

cd $PACKAGE_HOME
make clean
export CC=arm-linux-gnueabi-gcc
./configure --prefix=$PREFIX_PATH --host=arm-linux-gnueabi --with-shared --disable-stripping
# 
make -j 4

make install

1.8. 交叉编译dbm

1、在工程根目录下解压db压缩包

2、在工程根目录下配置脚本文件并执行

#!/bin/bash

PACKAGE_HOME=/home/a123/xxx/tools/4python/db-5.3.28/docs
CURRENT_HOME=$(pwd)

cd $PACKAGE_HOME
make clean

 # setup install path
USR_PREFIX=$CURRENT_HOME/cross_compile_dependency

 # configure bdb build environment
export CC=arm-linux-gnueabi-gcc
export STRIP=arm-linux-gnueabi-strip 
../dist/configure \
--build=x86_64-linux-gnu \
--host=arm-linux-gnueabi \
--prefix=$USR_PREFIX \
--enable-shared \
--enable-stripped_messages \
--enable-smallbuild \
# 我没有安装java和jdbc以及sql,所以注释了下面的东西
# --enable-java \
# --enable-jdbc \
# --enable-sql \



 # make -j 4
 # make install

然后,切换到/home/a123/xxx/tools/4python/db-5.3.28/docs下面,进行make和make install

1.9. 交叉编译gdbm

1、在工程根目录下解压gdbm压缩包

2、在工程根目录下编写脚本并执行

#!/bin/bash

PACKAGE_HOME=/home/a123/xxx/tools/4python/gdbm-1.18.1
CURRENT_HOME=$(pwd)
PREFIX_PATH=$CURRENT_HOME/cross_compile_dependency


cd $PACKAGE_HOME
make clean
export CC=arm-linux-gnueabi-gcc
./configure --prefix=$PREFIX_PATH --host=arm-linux-gnueabi --build=x86_64-linux-gnu --target=arm-linux-gnueabi
make -j4 && make install

1.10. 交叉编译lzma

1、在工程根目录下解压liblzam压缩包

2、在工程根目录下编写脚本并执行

#!/bin/bash

PACKAGE_HOME=/home/a123/xxx/tools/4python/liblzma-master
CURRENT_HOME=$(pwd)
PREFIX_PATH=$CURRENT_HOME/cross_compile_dependency

cd $PACKAGE_HOME
make clean
export CC=arm-linux-gnueabi-gcc
./configure --prefix=$PREFIX_PATH --host=arm-linux-gnueabi --build=x86_64-linux-gnu --target=arm-linux-gnueabi
make -j4 && make install

1.11. 交叉编译readline

1、解压压缩包

2、在工程目录下编写脚本并执行

#!/bin/bash

PACKAGE_HOME=/home/a123/xxC/tools/4python/readline-8.2
CURRENT_HOME=$(pwd)
PREFIX_PATH=$CURRENT_HOME/cross_compile_dependency

cd $PACKAGE_HOME
make clean
export CC=arm-linux-gnueabi-gcc
export CROSS_COMPILE=arm-linux-gnueabi-
./configure --prefix=$PREFIX_PATH --host=arm-linux-gnueabi 
make -j4 && make install

1.12. 编译设备端python

1、在根目录下编写脚本,并执行

#!/bin/bash

CURRENT_HOME=$(pwd)
DEPENDENCY_HOME=/home/a123/xxx/tools/4python/cross_compile_dependency
PYTHON_HOME=/home/a123/xxx/tools/4python/Python-3.8.6
USR_PREFIX=$CURRENT_HOME/python_arm


export CC=arm-linux-gnueabi-gcc
export CXX=arm-linux-gnueabi-g++
export RANLIB=arm-linux-gnueabi-ranlib
export STRIP=arm-linux-gnueabi-strip
export AR=arm-linux-gnueabi-ar

DEPENDENCY_LIB_PATH=$DEPENDENCY_HOME/lib
DEPENDENCY_INCLUDE_PATH=$DEPENDENCY_HOME/include
SUB_INCLUDE_PATH_LZMA=$DEPENDENCY_INCLUDE_PATH/lzma
SUB_INCLUDE_PATH_NCURSEW=$DEPENDENCY_INCLUDE_PATH/ncursesw
SUB_INCLUDE_PATH_READLINE=$DEPENDENCY_INCLUDE_PATH/readline
SUB_INCLUDE_PATH_OPENSSL=$DEPENDENCY_INCLUDE_PATH/openssl
SUB_INCLUDE_PATH_UUID=$DEPENDENCY_INCLUDE_PATH/uuid

DEPENDENCY_PKG_CONFIG_PATH=$DEPENDENCY_LIB_PATH/pkgconfig

export LD_LIBRARY_PATH=$DEPENDENCY_LIB_PATH:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=$DEPENDENCY_PKG_CONFIG_PATH:$PKG_CONFIG_PATH
export PATH=/home/a123/xxx/tools/4python/python_pc/bin:$PATH
export LDFLAGS="-L$DEPENDENCY_LIB_PATH"
export CFLAGS="-I$DEPENDENCY_INCLUDE_PATH -I$SUB_INCLUDE_PATH_LZMA -I$SUB_INCLUDE_PATH_NCURSEW -I$SUB_INCLUDE_PATH_READLINE -I$SUB_INCLUDE_PATH_OPENSSL -I$SUB_INCLUDE_PATH_UUID"
export CPPFLAGS="-I$DEPENDENCY_INCLUDE_PATH -I$SUB_INCLUDE_PATH_LZMA -I$SUB_INCLUDE_PATH_NCURSEW -I$SUB_INCLUDE_PATH_READLINE -I$SUB_INCLUDE_PATH_OPENSSL -I$SUB_INCLUDE_PATH_UUID"
# export LIBS="-lffi -lssl -lcrypto  -luuid -lbz2 -lz"

cd $PYTHON_HOME
make clean
./configure \
--host=arm-linux-gnueabi \
--build=x86_64-linux-gnu \
--prefix=$USR_PREFIX \
--disable-ipv6 \
--with-openssl=$DEPENDENCY_HOME \
ac_cv_file__dev_ptmx=no \
ac_cv_file__dev_ptc=no \
ac_cv_have_long_long_format=yes \

2、为了防止curses报错,在make之前进行这句话(切换到python源码目录)

sed -i "s/Werror=implicit-function-declaration/Wno-error/g" configure

3、make和make install

make HOSTPYTHON=/home/a123/xxx/tools/4python/python_pc/bin/python3.8 HOSTPGEN=/home/a123/xxx/tools/4python/Python-3.8.6/Parser/pgen -j4

make install

至此,编译arm版本的python完成,

1.13. 移植测试

接下来使用板子进行tftp文件传输

# 设置板子的网络ip
ifconfig eth0 192.168.10.50 

# 使用tftp从Ubuntu传输文件到板子
tftp -g -r build_arm.tar.gz 192.168.10.100

# 解压
tar -xzvf build_arm.tar.gz -C .

解压之后,打开build_arm中的python,如下,成功打开

内容创作不易,对您有帮助的话,可以支持打赏一下下

相关推荐
数据小爬虫@34 分钟前
利用Python爬虫获取淘宝店铺详情
开发语言·爬虫·python
高 朗1 小时前
【GO基础学习】基础语法(2)切片slice
开发语言·学习·golang·slice
寒笙LED1 小时前
C++详细笔记(六)string库
开发语言·c++·笔记
IT书架1 小时前
golang面试题
开发语言·后端·golang
初遇你时动了情1 小时前
uniapp 城市选择插件
开发语言·javascript·uni-app
编程修仙2 小时前
Collections工具类
linux·windows·python
芝麻团坚果2 小时前
对subprocess启动的子进程使用VSCode python debugger
linux·ide·python·subprocess·vscode debugger
EterNity_TiMe_2 小时前
【论文复现】神经网络的公式推导与代码实现
人工智能·python·深度学习·神经网络·数据分析·特征分析
Stara05112 小时前
Git推送+拉去+uwsgi+Nginx服务器部署项目
git·python·mysql·nginx·gitee·github·uwsgi
zongzi_4942 小时前
二次封装的天气时间日历选择组件
开发语言·javascript·ecmascript