移植Python2.7到ARM-LINUX嵌入式平台

2019-07-12 15:58发布

  最近组内项目需求,要在zynq-7035的arm板子里面搭建python的运行环境,来运行webserver程序,板子的linux 系统是参考米联客的移植教程,移植后是精简版的linux系统,只支持基本的linux系统,板子的交叉编译器是arm-linux-gnueabihf-gcc,这给我带来了不少的麻烦,以至于想重新移植一下debian系统。ok,转入正题,说说这两天我踩的坑吧。 首先在网上找了一下教程,参考求毕业哥的博客: http://www.cnblogs.com/hit-python/p/4079506.html 写的不错,编译完的python带常见的time等库,省了很多麻烦。但是按照教程编译完把_install文件夹拷贝到板子上后,./python不报错,但是也不是python的环境,反而是在pc上_install/bin目录下./python能够进入python的环境,由于交叉编译器是在pc变异,arm板子上运行的,所以教程里面设置交叉编译器的步骤没起作用: 设置交叉编译器 /home/liu/Python-2.7.3# CC=arm-xilinx-linux-gnueabi-gcc 设置C++交叉编译器 /home/liu/Python-2.7.3# CXX=arm-xilinx-linux-gnueabi-g++ 设置AR   /home/liu/Python-2.7.3# AR=arm-xilinx-linux-gnueabi-ar 设置RANLIB /home/liu/Python-2.7.3# RANLIB=arm-xilinx-linux-gnueabi-ranlib 后来又参考了另外一个帖子: https://cloud.tencent.com/developer/article/1167165 设置交叉编译器: ./configure --host=arm-none-linux-gnueabi --prefix=$PWD/_install 就是这个差别,第一个设置的交叉编译器没起作用,用的是pc上的gcc编译器,而不是板子的交叉编译器,最后在执行求毕业哥博客的最后一步,就解决了第二个帖子里面python库的问题了: /home/liu/Python-2.7.3# make install HOSTPYTHON=./hostpython BLDSHARED="arm-xilinx-linux-gnueabi-gcc -shared" CROSS_COMPILE=arm-xilinx-linux-gnueabi- CROSS_COMPILE_TARGET=yes prefix=/home/liu/Python-2.7.3/_install 把_install文件拷贝到板子里面,在_install/bin目录下./python就进入了python环境,输入exit()就退出python。 但是也遇到了一个问题,就是SD卡上的_install文件夹挂载到板子上后,无法用cp命令拷贝到板子里: 由于bin目录里面的文件格式问题,不能直接拷贝,chmod改变权限也不行,现在要解决这个问题,如果大家有解决办法欢迎告诉我。。。 然后运行webserser也迷之报错: 格式错误,这个报错信息都没法查找具体原因。。科研不易,坑要一个一个踩,嗯。。。 未完待更。。。 ----------------------------------------------------------更新-----------------------------------2018-12-14------------------------------- 首先,关于上面提到的_install文件无法拷贝的问题,主要原因应该是在pc的Ubuntu上面只是修改了文件夹的权限,应该是用chmod -R 777 /home/python-2.7.3/_install修改整个文件夹里面所有文件的权限,但是我分别复制_install下面的四个子文件夹也复制成功了。 第二个问题,运行webserver 的manage.py文件报错,其原因是在嵌入式的buildroot系统里,./manage.py默认的gcc的交叉编译器,而我们显然用的是移植好的python来运行.py文件,所以有两种办法 : 第一张最容易想到的就是把webserver 下面的所有文件拷贝到_install/bin目录下面,然后运行 ./python manage.py这就相当于pc的Ubuntu下面 python manage.py的运行方式,只不过./python只能在_install/bin目录下运行(生成的交叉编译文件在此目录下面)。但是如果后面我们要运行的.py文件很多的话,这种方式显然不够友好,那么多的文件混在一起,都分不清是哪个程序的,所以参考了python 文件编译器的路径设置,参考博客http://blog.sina.com.cn/s/blog_7b519a6b0101iyop.html 即在python文件的开头指定好编译器,#!/mnt/emmc/py_install/bin/python  这样python文件在别的目录下也能运行,只需要./manage.py即可。 然后你觉得这就可以了吧,python总算是移植成功了,但是更麻烦的事在后面,相比于python库的交叉移植,python的交叉移植显得容易多了,前面主要的问题也只是设置的am-linux-guneabihf-gcc交叉编译器没有生效而已,找到问题就很快解决了。但是这个,哎,叫苦不迭。 -------------------------------------------------------python库的交叉移植采坑记----------------------------------------------------------------------------- python移植成功后,运行manage.py文件提示没有django库,在python里面import django也提示没有这个库,安装django的时候提示缺少setuptools,安装setuptools的时候又提示缺少zlib,库的依赖关系就是如此复杂,现在的问题是zlib参考网上的资料交叉编译后,拷贝到板子里面无论怎样设置环境变量,python里面import zlib任然显示缺少 zlib库! 缺少django 库  安装django的 时候提示缺少setuptools. 安装setuptools的时候提示缺少zlib. 首先是在pc上交叉编译zlib ,参考博客http://www.mr-wu.cn/how-to-cross-compiling-zlib-for-arm/ 换成我的交叉编译器就是: CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld AS=arm-linux-gnueabihf-as ./configure --prefix=$PWD/_install make make install 然后就会在_install下面生成lib、include、share三个子文件夹,lib目录下面是生成的动态库和静态库,include下面有两个头文件。将文件夹拷贝到板子里面,设置环境变量我尝试了三中方式。 第一种就是将zlib交叉编译完成的lib、include、share三个子文件夹下的文件分别拷贝到py_install下面的对应的lib、include、share文件夹下,但是在python里面import zlib仍然找不到。 第二种方法, cd /切换到根目录,在根目录下面的usr路径下有lib等文件夹,没有include文件夹,那就新建include文件夹,然后将zlib中的lib和include文件分别拷贝到usr下面的lib和include文件夹下,但是在python下面仍旧报错。 第三种方法,参考博客https://blog.csdn.net/gaohuazhao/article/details/54317017 通过在python下import sys  sys.path.append('/mnt/emmc/zlib_install/lib/libz.so')方式将lib和include下的文件分别添加到python的环境变量搜索路径当中去,但是import zlib仍旧报错,此时我已经怀疑不是路径设置的问题了,可能是zlib交叉编译的问题。 之后在网上苦苦搜索,找到类似这样的帖子https://blog.csdn.net/feng973/article/details/78835453?utm_source=blogxgwz1 大概意思就是,要先交叉编译zlib然后在编译python,这样编译后的python 才能识别出来zlib库,我感觉这是唯一的希望了,于是将zlib交叉编译后,再重新交叉编译python,只是将上面python交叉编译第一步的 ./configure 添加 -with-zib选项, ./configure –prefix=/home/program/python3 –with-zlib=/usr/include ./configure –prefix=/home/program/python3 –with-zlib-dir=/usr/local/lib 博客里面是这种设置,但是实际运行的时候报错,我把它修改成./configure –prefix  –with-zlib=/usr/include这样没有报错,之后的编译方式和前面的一样,交叉编译完成以后还是在python的_install路径下生成四个子文件夹,拷贝到板子里,切换到bin目录下./python运行起来python环境但是import zlib还是报错。。这时我觉得可能是-with-zlib的路径没有指向对,于是把–with-zlib=/usr/include修改成–with-zlib=/home/zlib-1.21.1/_install/lib,这回指向了zlib下面的lib库,应该没问题了吧,然后按之前的方式编译完,拷贝到板子里面,在python的环境里面import zlib又报错了。。。 这回彻底不知道该怎么办了,但是我觉得还是zlib交叉编译的问题,或者是要先编译zlib再编译python,但是现在还没找到具体原因,采坑太多了,一个星期了还没解决一个python库的交叉移植。 未完待更。。。。。。