欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ARM开发板移植Python的各种坑

程序员文章站 2022-06-11 15:54:02
...

一、准备

资料准备:

1.Python-2.7.2.tar.bz2  官网可下载

2.Python-2.7.2-xcompile.patch   网上找的,具体来源不明,需要与Python版本相同

3交叉编译器 gcc-3.4.5-glibc-2.3.6,一定要用开发板资料里带的与开发板匹配的交叉编译器,此处有大坑

二、流程梳理(正常流程)

1.下载上述文件

2.安装交叉编译器(PC中操作,64位 Ubuntu 16.04 )

(1)将开发板资料里的 arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 解压到 /opt (可自己选择,后续配置环境变量时对应即可)中。

(2)shell中运行

sudo gedit /etc/profile

          在文档最后添加 export  PATH="$PATH:/opt/gcc-3.4.5-glibc-2.3.6/bin" ,路径与上述解压路径对应

          运行 source 指令使环境变量生效,也可重启使之生效

source /etc/profile

          运行下边指令验证环境变量是否配置成功 ,成功会显示版本号

arm-linux-gcc -v

ARM开发板移植Python的各种坑 

3.交叉编译Python源码

(1)将Python源码 Python-2.7.2.tar.bz2 与 Python-2.7.2-xcompile.patch  移动到同一文件夹,解压源码

tar xjvf Python-2.7.2.tar.bz2   #解压出 Python-2.7.2 文件夹

cd Python-2.7.2                 #进入 Python-2.7.2

(2)编译HOST版解释器

编译Python的嵌入式版需要解释器解析setup.py从而编译Python的模块,因此需要先编译出HOST的解释器。

./configure                            #
make python Parser/pgen                #
mv  python  hostpython                 #
mv  Parser/pgen  Parser/hostpgen       #
make distclean                         #

(3)打补丁 

patch -p1 < ../Python-2.7.2-xcompile.patch

(4)交叉编译配置

设置交叉编译工具链为arm-linux(根据交叉编译器设定),编译生成的执行文件存放目录为上层目录的_install文件夹。

创建 cc1.sh 文件,打开编辑,

#!/bin/sh
CC = arm-linux-gcc                #与要使用的交叉编译器对应
CXX= arm-linux-g++                #与要使用的交叉编译器对应
AR = arm-linux-ar                 #与要使用的交叉编译器对应
RANLIB=arm-linux-ranlib
 ./configure --host=arm-linux --prefix=$PWD/../Install \
     --build=x86_64-linux-gnu \
#	 --enable-readline	\
#    --enable-ipv6 \
#    --enable-shared \
     ac_cv_file__dev_ptmx="yes" \
     ac_cv_file__dev_ptc="no"

添加可执行权限 

chmod +x cc1.sh

(5)编译&安装

创建 cc2.sh 、cc3.sh 文件,打开编辑,并添加可执行权限 

#!/bin/sh
#cc2.sh
make  HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen 
BLDSHARED="arm-linux-gcc -shared"  \                #与要使用的交叉编译器对应
CROSS_COMPILE=arm-linux- \ 
CROSS_COMPILE_TARGET=yes \
#!/bin/sh
#cc3.sh
make install HOSTPYTHON=./hostpython \
     BLDSHARED="arm-linux-gcc -shared" \           #与要使用的交叉编译器对应
     CROSS_COMPILE=arm-linux- \
     CROSS_COMPILE_TARGET=yes \
     prefix=$PWD/../_Install
chmod +x cc2.sh cc3.sh

(6)依次运行cc1.sh,cc2.sh,cc3.sh

成功后在上层文件夹下的 _install 文件夹中,会出现以下4个文件夹,

ARM开发板移植Python的各种坑

 进入 bin文件夹,运行 ./python ,出现如下提示,说明交叉编译成功

 

ARM开发板移植Python的各种坑

 (7)将_install 文件夹打包 Python-2.7.2_install.tar.bz2 

tar cjvf Python-2.7.2_install4.tar.bz2 _install/

(8)通过虚拟机WinPC 或另一台window 电脑,使用SecureCRT 将 Python-2.7.2_install.tar.bz2 传到 ARM 开发板上

ftpget -p 21 <开发板IP> Python-2.7.2_install4.tar.bz2 /ToArm/Python-2.7.2_install4.tar.bz2

/ToArm 是SecureCRT 配置的本地路径

(9)在开发板上解压 Python-2.7.2_install.tar.bz2 

进入 _install/bin文件夹,执行 ./python ,成功

ARM开发板移植Python的各种坑


4.总结填坑

(1)运行cc2.sh、cc3.sh 时 ,提示:unable to execute arm-linux-gcc: No such file or directory 

ARM开发板移植Python的各种坑

       运行结束后进入生成的_Install/bin,运行./python,显示 [GCC 5.4.0 20160609] on linux,GCC版本与之前设置的交叉编译版本不一致,说明没有真正使用交叉编译器,而是使用系统默认的 x86_64-linux-gnu-gcc  编译器,此版本拷贝到开发板上输入./python是不能运行的,会提示带乱码的报错信息。

ARM开发板移植Python的各种坑

填坑:unable to execute arm-linux-gcc: No such file or directory的原因发现了2个:

1)交叉编译器 gcc 是 32 位,在64位系统上运行,需要安装 ia32-libs (已失效),替换安装 lib32ncurses5 和 lib32z1

ARM开发板移植Python的各种坑

2)运行 cc1.sh 、cc2.sh、cc3.sh 时不要 sudo(深坑) ,开始运行是习惯性的加了sudo,怎么都不行,多次实验后才发现去掉sudo才可以正常编译。

(2)交叉编译器版本

开发板资源包中的交叉编译器版本为 gcc-3.4.5-glibc-2.3.6,在处理上面问题时,怀疑过交叉编译器版本过旧的原因,在网上找了个 arm-linux-gcc-4.4.3-20100728.tar.gz,于是给自己又挖了个深坑。

通过上述(1)的方法,解决了unable to execute arm-linux-gcc: No such file or directory的问题,一路编译通过,上板运行,满怀希望,于是激动的出现了 -sh : ./python :not found(事后验证,如果交叉编译器使用原开发板系统原配的对应版本,此问题不会出现),什么鬼,百度、google一番,因为缺少库文件,在PC上使用

arm-linux-readelf -a ./python >2.txt

ARM开发板移植Python的各种坑

提示缺少/lib/ld-linux.so.3,到交叉编译器arm-linux-gcc-4.4.3-20100728.tar.gz解压出来的包中找到 ld-linux.so.3,拷贝到开发板 /lib 下,再次回到python文件夹下运行 ./python,-sh: ./python: Permission denied,噗!!!

是没有运行权限吗? chmod +x python 不行, chmod 777 python 还不行,什么情况啊,继续百goo,终于在某个角落提到编译器版本问题,换回原版 gcc-3.4.5-glibc-2.3.6 重新来过,一路下来,竟然一次通过。./python 终于出现了理想中的界面

ARM开发板移植Python的各种坑

事后总结:经过验证,如果交叉编译器使用正确的版本,即 gcc-3.4.5-glibc-2.3.6,依赖的库为  ld-linux.so.2,此库文件在开发板 /lib 中已经存在,所以在运行 ./python 是并不会出现  -sh : ./python :not found,后面也不会出现 -sh: ./python: Permission denied。

 

 

 


反思:填坑 = 学习

作为一个新手,一路跌跌撞撞,总算解决一个在别人看来可能都不值一提的问题,以至于在网上都不能找到几条同样问题的资料。遇到的各种坑,有些是因为我使用的开发板和网上教程使用的开发板有所区别,有些纯粹是自己给自己找麻烦,但是归根结底,还是因为自己是初学,知识积累有限,遇到问题没有方向,不知道该往哪些方面去思考、去查资料。经过这一番折腾,对ARM移植Python的过程有了一个梳理,同时对交叉编译有了一个大致的了解,在触及类似问题时,也有了大致的解决方向。

至于碰到的各种坑,在填的时候,是各种咬牙切齿。但是在填完之后,有的只是感激。

对于我这样一个刚接触嵌入式的新手来说,如果没有遇到各种各样的问题,一切按照网上的示例教程,一帆风顺的照葫芦画瓢,没有思考,没有实践,我可能能够快速的搭建起特定的应用场景,但是一旦碰到哪怕一丁点特殊情况,依然会被打回原形,不知所措。所以,填坑的过程,就是学习进步的过程,我很庆幸碰到了那么多坑,也很庆幸误打误撞的给自己挖了那么多坑,让我在入门的时候多学一些,多想一些,多积累一些。

相关标签: Python 移植