最近组内项目需求,要在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库的交叉移植。
未完待更。。。。。。