天天看点

ARM开发板移植Python的各种坑

一、准备

资料准备:

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的过程有了一个梳理,同时对交叉编译有了一个大致的了解,在触及类似问题时,也有了大致的解决方向。

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

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