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
- 在工程根目录解压zlib源码
- 在工程根目录编写脚本,并执行
#!/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
- 编译(记得先切换到zlib源码目录)
make -j n # n代表线程数量,根据自己电脑配置进行修改
- 安装
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
4. 编译(切换到libffi源码目录中)
make -j4
5. 安装
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,如下,成功打开
内容创作不易,对您有帮助的话,可以支持打赏一下下