一、准备
资料准备:
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
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个文件夹,
进入 bin文件夹,运行 ./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 ,成功
4.总结填坑
(1)运行cc2.sh、cc3.sh 时 ,提示:unable to execute arm-linux-gcc: No such file or directory
运行结束后进入生成的_Install/bin,运行./python,显示 [GCC 5.4.0 20160609] on linux,GCC版本与之前设置的交叉编译版本不一致,说明没有真正使用交叉编译器,而是使用系统默认的 x86_64-linux-gnu-gcc 编译器,此版本拷贝到开发板上输入./python是不能运行的,会提示带乱码的报错信息。
填坑:unable to execute arm-linux-gcc: No such file or directory的原因发现了2个:
1)交叉编译器 gcc 是 32 位,在64位系统上运行,需要安装 ia32-libs (已失效),替换安装 lib32ncurses5 和 lib32z1
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
提示缺少/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 终于出现了理想中的界面
事后总结:经过验证,如果交叉编译器使用正确的版本,即 gcc-3.4.5-glibc-2.3.6,依赖的库为 ld-linux.so.2,此库文件在开发板 /lib 中已经存在,所以在运行 ./python 是并不会出现 -sh : ./python :not found,后面也不会出现 -sh: ./python: Permission denied。
反思:填坑 = 学习
作为一个新手,一路跌跌撞撞,总算解决一个在别人看来可能都不值一提的问题,以至于在网上都不能找到几条同样问题的资料。遇到的各种坑,有些是因为我使用的开发板和网上教程使用的开发板有所区别,有些纯粹是自己给自己找麻烦,但是归根结底,还是因为自己是初学,知识积累有限,遇到问题没有方向,不知道该往哪些方面去思考、去查资料。经过这一番折腾,对ARM移植Python的过程有了一个梳理,同时对交叉编译有了一个大致的了解,在触及类似问题时,也有了大致的解决方向。
至于碰到的各种坑,在填的时候,是各种咬牙切齿。但是在填完之后,有的只是感激。
对于我这样一个刚接触嵌入式的新手来说,如果没有遇到各种各样的问题,一切按照网上的示例教程,一帆风顺的照葫芦画瓢,没有思考,没有实践,我可能能够快速的搭建起特定的应用场景,但是一旦碰到哪怕一丁点特殊情况,依然会被打回原形,不知所措。所以,填坑的过程,就是学习进步的过程,我很庆幸碰到了那么多坑,也很庆幸误打误撞的给自己挖了那么多坑,让我在入门的时候多学一些,多想一些,多积累一些。