编译环境

  • 虚拟机:VMware workplace pro 15
  • 平台:Ubuntu16.04
  • python:python 3.6.6
  • ARM :明远智睿 核心板 my-imx-6ul
  • 编译链:arm-linux-gnueabihf

步骤

  • 1.准备工作: 下载python源码包 编译和交叉编译zlib
  • 2.gcc编译和添加软连接
  • 3.交叉编译链配置
  • 4.交叉编译和打包
  • 5.解压到Linux环境,添加软连接

问题与系统中的配置项

1.准备工作
1.1 下载python

地址:https://www.python.org/downloads/source/
选择XZ格式的即可
解压:

xz -d Python-3.6.6.tar.xz 
tar -xvf Python-3.6.6.tar
1.2 编译和交叉编译zlib库
  • 作用:
  • 1.在编译和交叉编译python的过程中会遇到很多错误 提示没有安装zlib,此时如果提前配置了zlib就没这些麻烦了
  • 2.如果没有编译和交叉编译zlib,也没有配置这个项,的确也是可以正常编译的,但是呢,当我们用到第三方库的时候就会出问题了,即使正常交叉编译和导入这个库了,也是会出错的,比如:`
>>> import serial
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
zipimport.ZipImportError: can't decompress data; zlib not available

这样的问题我在反复试了几次后才明白其中的问题所在,按照
https://blog.csdn.net/jzzy_hony/article/details/79745136
其中的方法操作了,一步一步来,虽然麻烦一些,但是确实解决了问题,我们干嘛用python 大部分原因还是因为库,要是只用自带的那些库呢,简直太少了啊。

步骤:
(此处引用:https://blog.csdn.net/zenglaoshi/article/details/107376155
1.zlib下载:http://zlib.net/zlib-1.2.11.tar.gz

  • 解压
tar xzvf zlib-1.2.11.tar.gz # 解压缩
cd zlib-1.2.11

编译主机版zlib

./configure
make
sudo make install

编译目标版zlib

mkdir /opt/zlib
export CC=arm-linux-gnueabihf-gcc # 更改编译器
./configure --prefix=/opt/zlib # 指定编译目录
make
sudo make install
root@ubuntu:~# ls /opt/zlib
include  lib  share
2. ubuntu中编译python源码和添加软连接
2.1 编译准备:

在/usr/local/新建python安装路径 /usr/local/python3.6.6

mkdir /usr/local/python3.6.6

配置python安装位置和其他内容:

  • 配置zlib:
    需要修改一下 python源文件目录下/Modules/Setup.dist
    修改方式只需将改行前的#去掉即可
    图片来自https://blog.csdn.net/jzzy_hony/article/details/79745136
    (注:该图片来自https://blog.csdn.net/jzzy_hony/article/details/79745136 侵删)
 cd ~/Python-3.6.6/
 ls
 vim Modules/Setup.dist
 ./configure --prefix=/usr/local/python3.6.6
 make
 sudo make install

(注:在make install中可能遇到各种的问题)

2.2 添加软连接

添加软连接 可以将python3.6.6的解释器连接到 /usr/bin/python3

ln -s /usr/local/python3.6.6/bin/python3 /usr/bin/python3  # 很重要的一步

如果在原位置有python3 删除它并连接刚刚编译的python3.6.6
有了软连接 你就可以在系统中方便的使用 python3了,此时用的解释器就是python3.6.6

3.交叉编译链的配置
3.1 下载与配置

http://wiki.myzr.com.cn/index.php?title=MY-IMX6_Linux-4.1.15_编译参考手册
以上手册仅供参考 内容与实际不符
交叉工具链位置:
在这里插入图片描述

3.2 修改sh
对environment-setup-gcc-linaro-5.3-arm.sh进行相应的修改:
根据我们的工具链的位置进行对应修改
比如:
PATH_TOOLCHAIN=${HOME}/myzr/my-imx6/03_tools/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf
export ARCH=arm
export CROSS_COMPILE=${PATH_TOOLCHAIN}/bin/arm-linux-gnueabihf-

执行:

source environment-setup-gcc-linaro-5.3-arm.sh
${CROSS_COMPILE}gcc –v

出现该图片表示正常

3.3 修改profile

修改/etc/profile
在文件末尾添加:

export ARCH=arm
export CROSS_COMPILE=/home/lcy1992/myzr/my-imx6/03_tools/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
export PATH=/home/lcy1992/myzr/my-imx6/03_tools/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin:$PATH

(VIM在两个文件间复制的操作:通过按V,进入可视化操作方式,再复制)
修改之后需要:$ source /etc/profile
在进行交叉编译时最好以root用户的身份进行,否则遇到很多坑

不过会遇到:su: Authentication failure情况,此时需要参考
https://blog.csdn.net/jxaucm/article/details/80194372
只要你sudo passwd root过一次之后,下次再su的时候只要输入密码就可以成功登录了。

4 交叉编译
su
source /etc/profile  #最好再执行一次
./configure CC=arm-linux-gnueabihf-gcc CXX=CC=arm-linux-gnueabihf-g++ --host=arm-linux-gnueabihf --build=x86_64-linux-gnu --target=arm-linux-gnueabihf --disable-ipv6 --prefix=/opt/python3.6.6 ac_cv_file__dev_ptmx=yes ac_cv_file__dev_ptc=yes
make
make install
tar -zcvf /opt/python3.6.6.tar.gz  python3.6.6

在中间遇到的问题最大,虽然只有这样短短的几句,
这个问题我还是单开一个文章吧,就在本文的下一篇
以上是原方法,该方法利用的zlib是zlib1g但是在将编译好的文件应用到嵌入式板子上时会出问题,就是1.2中提到的那个问题,所以在看了https://blog.csdn.net/jzzy_hony/article/details/79745136之后我就选择用这种方法了再次感谢
以下引用该文作者的内容 侵删

  • 创建Ubuntu版本的pgen
  • 如果编译的是ARM架构的解释器,是不能在PC上运行的,会导致编译失败。
    所以要预先编译出一个能Ubuntu上运行的pgen。
$ cd ~/Python-3.6.6/
$ make distclean  
$ ls
$ ./configure
$ make Parser/pgen

交叉编译python3.6.6
1)在Python-3.6.6目录下,创建build-arm的目录;交叉编译python,将在这个目录下进行。
2)在/opt目录下创建python3.6.6目录;

  • 将交叉编译好的zlib库,复制到python3.6.6目录下,注意这一步很关键。
  • 注意是将zlib内的文件夹放到该目录下,这关系到后面的打包,python会到该位置找zlib
    注意…/configure,“/”的前面是有两个点的,代表运行上级目录的configure。
$ cd ~/Python-3.6.6/
$ mkdir build-arm
$ cd build-arm
$ sudo mkdir /opt/python3.6.6
$ sudo cp -rfp /opt/zlib/* /opt/python3.6.6/
$ ls /opt/python3.6.6/
$ ./configure CC=arm-linux-gnueabihf-gcc CXX=CC=arm-linux-gnueabihf-g++ --host=arm-linux-gnueabihf --build=x86_64-linux-gnu --target=arm-linux-gnueabihf --disable-ipv6 --prefix=/opt/python3.6.6 ac_cv_file__dev_ptmx=yes ac_cv_file__dev_ptc=yes

接下来不要急着make,下面的步骤很关键。
1)将刚才创建好的Ubuntu版本的pgen,复制到build-arm的Parser目录下。
2)交叉编译Python-3.6.6前必须修改Modules/Setup文件,(修改文件的方式在第2节,其实当时已经修改过,所以可以不再修改,)否则编译过程中有可能会报“zlib 模块找不到”的错误,对我更重要的是第三方库不能使用了。
3)touch –t 12312359 ./Parser/pgen ; (注:12.31 12:59)将pgen文件的日期改为今年的最后一分钟生成的。为什么需要这一步?因为arm版python在make时,会生成它的pgen,就会把刚才复制过来的pgen给替换掉,改成未来的时间,就会忽略跳过。

cd build-arm
cp ../Parser/pgen ./Parser/
touch -t 12312359 ./Parser/pgen
vim Modules/Setup   #可以没有

然后用root用户进行make 和make install

su
source /etc/profile  #最好再执行一次
make
make install
tar -zcvf /opt/python3.6.6.tar.gz  python3.6.6

到此,已经完成了主要部分,将压缩包打好了,接下来就是见证奇迹的时刻
(此处省去交叉编译 pyserial部分,在下一篇博文进行呈现)
(注:第4节有部分摘录自https://blog.csdn.net/jzzy_hony/article/details/79745136)侵删

5 复制到板子上运行
tar -zxvf python3.6.6.tar.gz /opt
ln -s /opt/python3.6.6/bin/python3 /usr/bin/python3  #最后一步  最重要也很简单

测试:

root@myimx6ek140p:# python3
Python 3.6.6 (default, Aug  8 2020, 07:35:00)
[GCC 5.3.1 20160113] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>>> import zlib
>>> import serial
# 此处没有消息就是好消息

参考文章:
https://blog.csdn.net/zenglaoshi/article/details/107376155
https://blog.csdn.net/u012230668/article/details/89206857
ARM 40 PYTHON3.6 方法复杂一点但是管用
我发现的最早的方法,也很全面

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐