Ubuntu环境下交叉编译python3.6.6
编译环境虚拟机:VMware workplace pro 15平台:Ubuntu16.04python:python 3.6.6ARM :明远智睿核心板 my-imx-6ul编译链:arm-linux-gnueabihf步骤1.下载安装包2.gcc编译和添加软连接3.交叉编译链配置4.交叉编译和打包5.解压到Linux环境,添加软连接问题与系统中的配置项1.下载地址:https://www.pyt
编译环境
- 虚拟机: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 侵删)
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 方法复杂一点但是管用
我发现的最早的方法,也很全面
更多推荐
所有评论(0)