python及第三方库交叉编译

一、前言:网上关于python的交叉编译的文章很多,但是关于python第三库的交叉编译的文章就比较少了 , 而且很多标题是第三方库的交叉编译 , 但是实际上用到的都是不需要交叉编译就能用的库 , 可参考性不强,最近关于python及其第三方库的交叉编译也踩了不少坑,记录一下!
二、交叉编译介绍:1、什么是交叉编译:在一个平台上生成另一个平台上的可执行代码 。
2、为什么要交叉编译:在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力 , 比如常见的ARM 平台,其一般的静态存储空间比较?。鳦PU运算能力弱 。这种情况下,在ARM平台上进行本机编译就不太可能了,为了解决这个问题,交叉编译工具就应运而生了 。通过交叉编译工具,我们就可以在CPU能力很强、存储控件足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序 。
三、python及其第三方库的交叉编译背景1、交叉编译链:rv1126-arm-buildroot-linux-gnueabihf-toolchain.tar.bz2
2、目标板子(target主机):armv7l
3、执行交叉编辑的主机(build主机):ubuntu18-x86_64
4、python版本:3.5.2
5、numpy==1.18.5
四、交叉编译的准备工作build主机是我新安装的一个ubuntu18的新虚拟机,所以连gcc 都没有的
1、安装gcc: sudo apt-get install gcc-8 -y
2、将gcc-8指定成默认的gcc:  sudo ln -s /usr/bin/gcc-8 /usr/bin/gcc

python及第三方库交叉编译

文章插图
3、安装cmake:  sudo apt-get install make cmake -y
4、安装libffi-dev 交叉编译 python 需要的依赖:  sudo apt-get install libffi-dev
5、安装zip 解压压缩包使用:sudo apt-get install zip -y
五、交叉编译python及其第三方的思路1、在build主机上交叉编译zlib库,这个是python源码安装必须的依赖库
2、在build主机上交叉编译openssl库,这个虽然不是源码安装必须的依赖库 , 但是大部分其他库都有可能使用到这个库
3、在build主机上安装build主机上的python版本,我们成为python-build
4、在build主机上交叉编译target主机上的python版本,我们称之为python-target
5、在build主机上通过crossenv搭建target-python的运行虚拟环境
6、在crossenv虚拟环境中通过pip打包交叉编译第三方库为.whl形式的
六、准备交叉编译工具1、解压交叉编译链:说明不同的平台的使用的交叉编译链不同,但是思路和步骤是一样的 。
tar jxvf rv1126-arm-buildroot-linux-gnueabihf-toolchain.tar.bz2
解压之后得到一个名为 host 的文件夹 。
python及第三方库交叉编译

文章插图
2、进入 host 目录: cd host
3、执行 relocate-sdk.sh 指令:  ./relocate-sdk.sh?。ú皇撬薪徊姹嘁肓炊夹枰庖徊降模?
4、将交叉编译链添加到环境变量:vim /etc/profile
5、在最后添加:export PATH=$PATH:/home/host/bin  这里的路径根据自己实际的路径进行修改即可 。
python及第三方库交叉编译

文章插图
6、重新加载环境变量:source /etc/profile
7、测试:arm-buildroot-linux-gnueabihf-gcc -v
python及第三方库交叉编译

文章插图
七、准备openssl-build这里我已经准备好了openssl-1.0.2g.tar.gz的压缩包,这里我尝试了openssl-1.1.1的版本,但是和python3.5.2不太合适 , 总是有问题,所以这里我使用的是openssl-1.0.2的版本
1、 解压源码包,这些源码包我都是放在/home路径下的:tar -xzvf openssl-1.0.2g.tar.gz
2、对压缩包进行重命名,区分是在build主机上用的还是在target主机上用的,在build主机上用的我都统一在后面加上_build,在target主机上使用的统一在后面加上_target
mv openssl-1.0.2g openssl-1.0.2g-build
3、cd openssl-1.0.2g-build
4、设置编译环境:./config --prefix=/home/openssl-1.0.2g-build/openssl-build
其中: --prefix是指定编译后的安装的路径
5、执行编译安装:make && make install   此时在/home/openssl-1.0.2g-build里面就会有openssl-build文件夹
python及第三方库交叉编译

文章插图
6、因为安装的ubuntu18中默认的openssl是1.1.1 , 我们需要换成我们的openssl-1.0.2g
python及第三方库交叉编译

文章插图
  把以前的备份:sudo mv /usr/bin/openssl /usr/bin/openssl.old
7、建立新的软连接:sudo ln -s /home/openssl-1.0.2g-build/openssl-build/bin/openssl /usr/bin/openssl

推荐阅读