首页 > 编程语言 >Python3交叉编译步骤(二)-三方库的交叉编译

Python3交叉编译步骤(二)-三方库的交叉编译

时间:2022-09-22 16:14:24浏览次数:50  
标签:gnueabihf 交叉 python 编译 install linux arm Python3


一.项目场景
在cortex-A9主板上运行python3,能够使用常用的三方库
二.配置
主机环境:ubuntu-18.04-x86_64(虚拟机)
交叉编译链:arm-linux-gnueabihf-gcc
开发板:cortex-A9(armv7l)


三.安装交叉编译器
安装编译器
拷贝编译链压缩包到虚拟机中的Documents目录,CD到该目录然后执行tar -xvf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf.tar.xz 得到gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf

 

 

 


配置环境变量
Cd到/home/用户/目录vim .bashrc,编辑终端的配置文件,将交叉编译工具加入环境变量
export PATH=$PATH:/home/h5000/Documents/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin保存并退出,.bashrc,重新启动终端,输入arm-linux-gnueabihf-gcc -v测试交叉编译工具,出现下图则配置成功

 

 

 


四 下载python
新建一个文件夹,虚拟机联网:在命令行中输入:wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz
下载成功后开始解压
或者直接拷贝相应的源码Python-3.6.9.tar.xz到ubuntu解压
Cd到安装包目录执行以下命令:
1. tar -xvf Python-3.6.9.tar.xz

 

 

 

 

 

 


五.安装相关环境依赖
使用下面的命令进行安装编译所需要的依赖
1. sudo apt-get install openssl
2. sudo apt-get install libssl-dev
3. sudo apt-get install gcc make cmake –y
4. sudo apt-get update
六.三方库安装

zlib必备安装库
wget http://zlib.net/zlib-1.2.11.tar.gz
tar -xvf zlib-1.2.11.tar.gz
cd zlib-1.2.11/
CC=arm-linux-gnueabihf-gcc./configure--prefix=$HOME/my_python/install/arm/
make && make install

openssl对于需要用到https场景需要安装该库
wget https://github.com/openssl/openssl/archive/refs/tags/OpenSSL_1_1_1d.tar.gz
tar -xvf OpenSSL_1_1_1d.tar.gz
cd openssl-OpenSSL_1_1_1d/
./config no-asm --prefix=$HOME/my_python/install/arm/ --cross-compile-prefix=arm-linux-gnueabihf-
#这里主要解决报错:error: unrecognized command line option ‘-m64’
vi Makefile
#删除 -m64
make && make install

libffi对于需要用到_ctypes模块需要安装该库
wget https://github.com/libffi/libffi/archive/refs/tags/v3.2.1.tar.gz
tar -xvf libffi-3.2.1.tar.gz
cd libffi-3.2.1/
CC=arm-linux-gnueabihf-gcc ./configure --host=arm-linux-gnueabihf --prefix=$HOME/my_python/install/arm/
make && make install

cd Python-3.6.9/
1.开启zlib依赖
>vi Modules/Setup
>#开放这一句取消注释
>zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib –lz

 

 

 


2.开启openssl依赖
vi Modules/Setup
#开放这一句取消注释
SSL=$(prefix)
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl –lcrypto

 

 

 

3. 开启libffi依赖
export PKG_CONFIG_PATH=/home/my_python/install/arm/lib/pkgconfig:$PKG_CONFIG_PATH

 

 



4 . python库添加
arm系统安装python没办法直接利用pip进行库安装,这时候需要利用虚拟机上进行pc的库安装将安装好的库移植的lib目录下。
具体安装目录:
#将需要安装的库在虚拟机中pip install XX 后然后拷贝到目标板的site-packages目录下

 

 


七. 编译本机HOST解释器
在交叉编译的时候需要在HOST PC上运行对应版本的Python程序,所以需要先编译HOST PC上面用的Python,运行以下命令进行编译
1. cd Python-3.6.9/
2. ./configure --prefix=$PWD/../_install_host --enable-shared LDFLAGS="-L/home/h5000/my_python/install/arm/lib" CPPFLAGS="-I/home/h5000/my_python/install/arm/include"
3. make -j4
4. make install
5. make distclean
–-prefix指定的目录可自行修改,但不要放在Python-3.6.9目录里,因为后续执行make distclean会清掉一些文件。

 

 


把生成HOST PC端即install/pc目录中的bin和lib,加到环境变量里面去,此处的地址为install/pc我的地址是:my_python/install/pc后续交叉编译就会自动找到python3了,其指令如下:
sudo gedit ~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/h5000/my_python/install/pc/lib
export PATH=$PATH:/home/h5000/my_python/install/pc/bin输入以上指令后,重启命令窗口输入python3 指令 如图2.2所示:

 

 


至此,本机已经编译完成
接下来编译目标板(arm板)
八. 配置交叉编译工具链
这里采用的是arm-linux-gnueabihf交叉编译工具链
/home/h5000/Documents/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf-gcc
配置交叉编译工具链命令如下:
1. cd Python-3.6.9/
2. CC=arm-linux-gnueabihf-gcc \
3. CXX=arm-linux-gnueabihf-g++ \
4. AR=arm-linux-gnueabihf-ar \
5. RANLIB=arm-linux-gnueabihf-ranlib \
6. STRIP=arm-linux-gnueabihf-strip \
7. ./configure --host=arm-linux-gnueabihf --prefix=$HOME/my_python/install/arm/ \
8. --build=x86_64-linux-gnu \
9. --with-system-ffi \
10. --disable-ipv6 \
11. ac_cv_file__dev_ptmx=no \
12. ac_cv_file__dev_ptc=no
–host是交叉编译工具链,–build表示编译出来的程序运行的处理器,–prefix表示安装目录。
配置交叉编译链后,把/home/h5000/my_python/install/arm 中交叉编译生成的include,lib拷贝到交叉编译工具链的include,lib目录中

九. 目标板编译安装
在Python-3.6.9目录中,运行以下命令
1. make -j 4 && make install

 

 


若出现报错:subprocess.CalledProcessError: Command ‘(‘lsb_release’, ‘-a’)’ returned non-zero exit status 1.

 

 


执行以下命令后重新make install即可
1. sudo rm -rf /usr/bin/lsb_release
2. make install

 

 


编译成功后在$HOME/my_python/install/arm/目录下生成bin,include,lib,share,ssl四个文件夹,如图所示

 

 


十. 移植到开发板并测试
将交叉编译出来的arm目录压缩打包拷贝到目标板,然后解压,
1. tar -xvf _install
2. cd /usr/bin/
3. mkdir python
4. cd _install
5. cp -r bin /usr/bin/python
6. cp -r include /usr/bin/python
7. cp -r lib/usr/bin/python
8. cp -r share /usr/bin/python
然后把解压出来的bin,include,lib,share,ssl五个文件夹复制到python目录中

 

 


然后配置开发板的环境变量,把python加入环境变量中
输入vi ~/.bashrc
添加:export PYTHONPATH="/yourpath/:$PYTHONPATH"
执行source ~/.bashrc使修改立即生效

 

 


保存后输入python3查看

 

 


导入对应模块验证:

 

 

至此,python3和三方库zlib交叉编译移植已完成

 

标签:gnueabihf,交叉,python,编译,install,linux,arm,Python3
From: https://www.cnblogs.com/handouergege/p/16719649.html

相关文章

  • Pycharm的安装并且连接已有的Python环境实现自由编译(附中文配置)|并通过Pycharm实现增加
    Python环境的配置 通过python的官方网站:python.org即可进入python的官网-->选择Downloads即可进入选择版本的界面,在界面中选择自己想要下载的版本即可,下载好之后在安装界......
  • C#教程 - 编译器(Compile)
    更新记录转载请注明出处:2022年9月22日发布。2022年9月10日从笔记迁移到博客。编译器的类型csc//.NETFrameworkmsc//Monodotnet//.NetCoreC#......
  • 编译原理:运行时机制
    在语义分析之后,编译过程就开始进入了中后端。经过前端阶段的处理分析,编译器已经充分理解了源代码的含义,准备好把前端处理的结果(带有标注信息的AST、符号表)翻译成目标代码......
  • 浅谈汇编器、编译器、解释器和虚拟机
    1、汇编器:将汇编语言翻译成机器语言 2、编译器:将高级语言翻译成汇编语言,再由汇编器去处理 3、解释器:随着时间的推移,一种新的编程方式兴起了。一种被称为“解释器”的......
  • 编译系统的组成
    cmake、autoconf/automake无组建系统,为了解决Makefile难以书写问题由于make运行时需要把每个文件夹下的Makefile都include进来,比较耗时,于是开发出ninja组建系统,它运行时......
  • Python3 + selenium 获取疫情中高风险区数据
    背景:需要动态将疫情风险区数据和区域业务动作想结合,赋能销售业务,内部使用非商用哈环境:Python3+selenium自动化测试软件中Chrome驱动exe文件输出:以e......
  • elasticsearch8.1源码编译笔记
    环境idea2022.1.3jdk17macos10.14.6gradle7.4.2(代码自动下载)前置准备idea设置JDK17idea设置gradleJVM为ProjectJVMgradle设置aliyun加速(可选),有时设......
  • Python3-eg
    实例01(判断输入的是不是黄蓉所说的数)1print("今有物不知数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?\n")2number=int(input("请输入您认为符合条件的数:"))......
  • vue3源码学习11-编译two-AST内部转换
    在编译one中,template经过解析最终返回了一个AST节点对象,它是对模板的完整描述,但是还是不能用于生成代码,因为语义化还不够,没有包含编译优化相关的属性,vue内部还进行了进一步......
  • windows下mingw64编译darknet过程中遇到的错误记录下
    ./examples/go.c:787:5:error:unknowntypename'fd_set';didyoumean'fpos_t'? 解决:      go.c文件中添加头文件#include<sys/select.h> ./include......