首页 > 系统相关 >交叉编译移植Python到arm架构下的Linux系统

交叉编译移植Python到arm架构下的Linux系统

时间:2022-09-07 17:23:52浏览次数:116  
标签:编译 Python linux dev python Linux arm

参考:https://blog.csdn.net/weixin_41922484/

   https://blog.csdn.net/qq_28351465/article/details/54406180

     https://cloud.tencent.com/developer/article/1570901?from=15425

  编译环境:ubuntu-12.0.4

  编译器:gcc arm-arago-linux-gnueabi

  Python版本:3.8.0

  Python安装包文件名:Python-3.8.0.tgz

  整个过程分为三大步骤:

      1. 直接编译python,生成Python解释器,如果你的编译系统没有对应的Python你还需要按照对应的Python,不然会缺失编译环境

      2. 交叉编译python

      3. 复制可移植文件到arm文件系统

一、具体步骤:

  1、源码下载

​wget https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tar.xz
xz-d Python-3.8.3.tar.xz
tar -xvf Python-3.8.3.tar.xz
cd Python-3.8.3

  如果PC上预先没有 python3.8 的版本,则需要编译安装3.8的PC版本,安装步骤可参考:https://www.cnblogs.com/xingboy/p/16579824.html

  接着编译 python Pareser/pgen ,生成 Python 解释器

    ./configure

    make

  2、在Python-3.8.0目录下新建mylib文件夹,用于存放生成的可移植文件:

    命令:mkdir mylib

  3、新建一个参数设置脚本,该脚本主要配置一些编译参数 vim  myPythonMake.sh

#!/bin/sh
CC=arm-linux-gnueabihf-gcc \    # CC为指定C交叉编译器,可查看你的交叉编译器的bin文件夹得知
CXX=arm-linux-gnueabihf-g++ \  # CXX为指定C++交叉编译器,可查看你的交叉编译器的bin文件夹得知
AR=arm-linux-gnueabihf-ar \    # AR为ar工具,可查看你的交叉编译器的bin文件夹得知
RANLIB=arm-linux-gnueabihf-ranlib \  # RANLIB为ranlib工具,可查看你的交叉编译器的bin文件夹得知
./configure \      # 执行编译配置指令
         --host=arm-linux-gnueabihf \  # Host为目标主机,也就是准备安装平台的编译器去掉 -gcc
         --build=x86_64-linux-gnu \    # Build为编译环境主机,也就是你的编译机器的交叉编译器,可执行 gcc -v 命令查看,我这里看得的是 Target: x86_64-linux-gnu
         --disable-ipv6 \     # –disable-ipv6 禁用ip6
         --prefix=/home/aplex/myPython3.8/Python-3.8.0/mylib \    # Prefix为安装位置,就是你交叉编译完 python 后的文件保存位置
         ac_cv_file__dev_ptmx=no \  # 从目标板即arm板上的/dev下查看是否有ptmx设备,有的话就是yes,没有就是no
         ac_cv_file__dev_ptc=no    # 从目标板即arm板上的/dev下查看是否有ptc设备,有的话就是yes,没有就是no

  4、编写开始编译脚本,配置编译参数 vim myMakePython.sh

#!/bin/sh
make \
    HOSTPYTHON=./python \    # HOSTPYTHON 指定我们之前编译的X86版本的python文件
    HOSTPGEN=./Parser/pgen \ # HOSTPGEN 指定我们之前编译的X86版本的pgen文件
    BLDSHARED="arm-linux-gnueabihf-gcc -shared" \
    CROSS_COMPILE=arm-linux-gnueabihf- \
    CROSS_COMPILE_TARGET=yes \
    HOSTARCH=arm-linux-gnueabihf \
    BUILDARCH=x86_64-linux-gnu

  5、编写安装脚本,配置安装参数 vim myPythonInstall.sh

#!/bin/sh
make install HOSTPYTHON=./python \
    BLDSHARED="arm-linux-gnueabihf-gcc -shared" \
    CROSS_COMPILE=arm-linux-gnueabihf- \
    CROSS_COMPILE_TARGET=yes \
    prefix=/home/aplex/myPython3.8/Python-3.8.0/mylib

  6、复制 mylib 目录下文件到你要移植的 arm 文件系统即可,具体的移植环境配置可参考上述步骤1的安装步骤:https://www.cnblogs.com/xingboy/p/16579824.html

   最后会在prefix指定的目录下有新生成的文件和文件夹,主要文件夹是/bin,/include,/lib,/share。把他们都复制到目标机器的/usr目录下。最后在目标机上执行一下命令可以检查python环境是否完整

二、报错总结:

  1、checking for python interpreter for cross build... configure: error: python3.8 interpreter not found

    主要报错原因是本地PC上无3.8的python版本。

  2、安装时报错ModuleNotFoundError: No module named '_ctypes'的解决办法   

    2.1、执行如下命令: 

yum install libffi-devel  //安装 libffi-devel

    2.2、从"./configure ..."重新安装

  3、pip3 install时报错“pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.”

    先安装openssl-dev,然后重新编译安装,只是在编译的过程中加入 --enable-optimizations

Ubuntu:
    
    sudo apt-get install libffi-dev

或者:

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get dist-upgrade 
    sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus
    sudo apt-get install build-essential libncursesw5-dev libgdbm-dev libc6-dev
    sudo apt-get install zlib1g-dev libsqlite3-dev tk-dev 
    sudo apt-get install libssl-dev openssl 
    sudo apt-get install libffi-dev

 

标签:编译,Python,linux,dev,python,Linux,arm
From: https://www.cnblogs.com/xingboy/p/16562726.html

相关文章

  • python数据类型之字典Dictionary
    1.python字典字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过......
  • linux 信号概念
    信号的概念信号(Signal)是一种软件中断,比如Ctrl+C的退出命令实质上就是使用了信号。信号在Linux操作系统中提供了一种处理异步事件的方法,可以很好地在多个进程之间进行同步......
  • python 将print内容打印到文件中
    python中print内容打印到文件中importsysfile=open("502log.txt",'a')sys.stdout=fileprint(time.asctime(),"开始请求。。。。。")file.close()这里将prin......
  • Linux系统配置(防火墙)
    前言linux系统服务器如果作为网关服务器或网络服务器来使用时,配置规划防火墙能够很好的为服务器提供安全保障,Linux系统的RHEL7系列之前默认是通过iptables管理防火墙,......
  • 这个Python读取文件的方法,堪称天花板级别...
    前言嗨喽,大家好呀~这里是爱看美女的茜茜呐又到了学Python时刻~今天咱们来了解一下fileinput。说到fileinput,可能90%的码农表示没用过,甚至没有听说过。这不奇怪,因......
  • Linux 下 tar 打包命令详细教程
    转:Linux下tar打包命令详细教程 1.打包:选项“-cvf”一般是习惯用法,记住打包时需要指定打包之后的文件名,而且要用“.tar”作为扩展名。打包目录也是如此:......
  • python中index()、find()方法
    python中index()、find()方法,具体内容如下:index()方法检测字符串中是否包含子字符串str,该方法与pythonfind()方法一样,只不过如果str不在string中会报一个异常。影响......
  • 手把手教你君正X2000开发板的OpenHarmony环境搭建
    摘要:本文主要介绍基于君正X2000开发板的OpenHarmony环境搭建以及简单介绍网络配置情况本文分享自华为云社区《君正X2000开发板的OpenHarmony环境搭建》,作者:星辰27。本文......
  • 【Python】 map() 函数
    map()函数map(function,iterable,...)>>>importmap#计算平方>>>list(map(lambda:x:x**2,[1,2,3,4,5]))#使用lambda匿名函数[1,4,9,16,25]#提供了两个......
  • python3基础语法2
    Python3.0在设计的时候没有考虑向下兼容。官方宣布,2020年1月1日,停止Python2的更新。编码默认情况下,Python3源码文件以 UTF-8 编码,所有字符串都是unico......