交叉编译Python3.8

news2024/12/25 8:55:05

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
  1. 编译(记得先切换到zlib源码目录)
make -j n # n代表线程数量,根据自己电脑配置进行修改
  1. 安装
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,如下,成功打开

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2132192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“爱学术”期刊采编系统的设计与实现---附源码 76126

摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用SpringBoot技术建设“爱学术”期刊…

【Qt】样式属性

样式属性 QSS 中的样式属性⾮常多, 不需要都记住. 核⼼原则还是⽤到了就去查. ⽂档的 Qt Style Sheets Reference 章节详细介绍了哪些控件可以设置属性, 每个控 件都能设置哪些属性等. 在样式属性中有一个“盒子模型需要重点介绍” 盒子模型 在⽂档的 Customizing Qt Widget…

Kubernetes从零到精通(10-服务Service)

Service简介 Deployment这种工作负载能管理我们应用Pod的副本数&#xff0c;并实现动态的创建和销毁&#xff0c;所以Pod本身是临时资源&#xff08;IP随时可能变化&#xff09;。现在如果某组Pod A需要访问另一组Pod B&#xff0c;A就需要在应用的配置参数里动态跟踪并更改B的…

java(1)数据类型,运算符,逻辑控制语句以及基本应用

目录 ​编辑 1.前言 2.正文 2.1数据类型与变量 2.1.1字面常量 2.1.2数据类型 2.1.3变量 2.1.3.1整型 2.1.3.2浮点型 2.1.3.3字符型 2.1.3.4布尔型 2.1.4类型转换与类型提升 2.1.4.1字符串的拼接 2.1.4.2整型转字符串 2.1.4.3字符串转整数 2.2运算符 2.2.1算术运…

【效果+教程】免费!实操用AI设计图标Logo,不仅省了设计费,还是副业新赛道!

Logo是一个品牌或公司的视觉标识 一个好的logo可以帮助消费者快速识别品牌&#xff0c;增强品牌的可见性和记忆度。 一个专业设计的logo能够提升品牌的可信度&#xff0c;给人一种专业和可靠的印象。 一个设计精美且富有意义的logo能够与消费者建立情感联系&#xff0c;增强…

10887辆 捷途旅行者8月再夺方盒子销冠

近日&#xff0c;8月汽车销量排行榜正式出炉。捷途旅行者年内第四次实现月销过万&#xff0c;以10887辆的优异成绩&#xff0c;持续领跑方盒子市场。作为名副其实的畅销车型&#xff0c;捷途旅行者自去年上市以来&#xff0c;不仅连续三个季度卫冕方盒子销量冠军&#xff0c;创…

C++类与对象(下)--最后的收尾

内部类 • 如果⼀个类定义在另⼀个类的内部&#xff0c;这个内部类就叫做内部类。内部类是⼀个独⽴的类&#xff0c;跟定义在 全局相⽐&#xff0c;他只是受外部类类域限制和访问限定符限制&#xff0c;所以外部类定义的对象中不包含内部类。 #include<iostream> using…

C++中string使用

目录 介绍 使用 迭代器&#xff08;Iterator&#xff09; begin&#xff0c;end rbegin&#xff0c;rend 容量&#xff08;Capacity&#xff09; size&#xff0c;length capacity empty clear resize reserve 元素访问&#xff08;Element access&#xff09; ope…

美国陆军发布下一代目标识别和感知倡议

文章目录 前言一、下一代目标识别与感知倡议的内容二、下一代目标识别与感知倡议重点关注领域(1)目标标记、跟踪和定位 (TTL)(2)侦察和监视 (R&S)(3)无人系统 (UMS)前言 2024年7月23日,美国陆军发布了下一代目标识别与感知倡议,希望工业界能够开发战场态势感知、侦…

LeetCode 692.前K个高频单词

LeetCode 692.前K个高频单词 C 思路&#x1f9d0;&#xff1a; 首先用map存储该字典&#xff0c;然后放进vector进行排序&#xff0c;注意sort的排序规则与我们想要的规则不一致&#xff0c;所以我们需要写一个伪函数来判断second(value值)&#xff0c;由于该题要求了稳定性&am…

Rider使用习惯

1.修改rider的快捷方式为VSCode样式的&#xff0c;修改设置方式 2.在项目中点击某个脚本文件&#xff0c;即在项目视图中选中这个文件&#xff0c;设置方式如下&#xff1a; 暂时先记录这么多&#xff0c;以后有零碎的随时记录

VUE,element-ui,优化tabs组件每次点击,所有子页面都重新渲染问题

1.在data中定义每个子组件相应的值&#xff0c;ture为加载&#xff0c;false为不加载。 2.在子组件中使用v-if来判断是否渲染当前页面 3.在函数中对子组件的值进行切换。 handleClick(){if(this.activeNamefirst){this.pageOne truethis.pageTwo false}else if(this.active…

通过 4EVERLAND 的终极 4EVER Boost 活动增强你的活动能力!

介绍 近日&#xff0c;4EVERLAND宣布启动最新、最激动人心的计划 — 4EVER Boost 活动&#xff01;4EVER Boost 活动旨在吸引更多社区成员加入并加速去中心化物理基础设施4EVER 网络的发展。用户可以参与节点质押、日常任务和 T4EVER/NFT 质押&#xff0c;以加快获得 $4EVER 积…

Spring Security认证与授权

1 Spring Security介绍 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。由于它是Spring生态系统中的一员&#xff0c;因此它伴随着整个Spring生态系统不断修正、升级&#xff0c;在spring boot项目中加入springsecurity更是…

隔离DCDC模块B0505/B0503对RS485和CAN总线进行电源隔离

CAN和485都是工业通信中常用的现场总线&#xff0c;做好通信总线的隔离防护是产品可靠、稳定的重要前 提。 一、通信总线为什么要隔离&#xff1f; 目前大多数产品对外通讯部分可总结为&#xff1a; MCU收发器外部总线&#xff0c;其中大多数常用的MCU都集成有CAN或UART链路层…

Linux中的简单命令2

一.echo指令 echo的作用是显式文本内容 #echo ‘字符串’ #echo “字符串” echo会将后面的内容当作字符串直接打印在屏幕上&#xff0c;后面的内容需要用单引号或者双引号括起来 注意&#xff1a;echo会自动在字符串后面加上一个换行符。 可以与printf进行对比&#xff1a; …

从Zotero6到Zotero7的数据迁移尝试?(有错勿喷,多多指教!)

从Zotero6到Zotero7的数据迁移尝试 0 前言 之前在主机上一直用的Zotero6&#xff08;实验室主机&#xff09;&#xff0c;最近发现在个人笔记本上看论文更频繁&#xff0c;尝试重新部署Zotero&#xff0c;才发现竟然更新了&#xff01;所以这里简单记录一下数据迁移过程&…

水厂中的反冲洗工艺

滤池作为水厂的重要的处理单元之一,滤池的形式多种多样,但其截留水中杂质的原理基本相同。我们以常见的V型滤池为例,介绍一下水厂中的反冲洗工艺。 V型滤池是快滤池的一种形式,因为其进水槽形状呈V字形而得名,也叫均粒滤料滤池(其滤料采用均质滤料,即均粒径滤料)、六阀滤…

代码随想录算法训练营第14天|226. 翻转二叉树、101. 对称二叉树、104. 二叉树的最大深度、111. 二叉树的最小深度

目录 226. 翻转二叉树1、题目描述2、思路3、code&#xff08;后序递归&#xff09; 101. 对称二叉树1、题目描述2、思路3、code 104. 二叉树的最大深度1、题目描述2、思路3、code 111. 二叉树的最小深度1、题目描述2、思路3、code 226. 翻转二叉树 题目链接&#xff1a;link …

2024年最新软件测试学习路线图(从入门到精通)

六维全息课程注重综合能力培养&#xff0c;从入学到职后一站式服务测试开发人才。2024年最新软件测试学习路线图&#xff0c;从入门到精通一应俱全。 9阶段专业课11大专项测试项目 适应互联网企业测试开发需求。 对于想入行学软件测试的新手来说&#xff0c;首先就需要一个高效…