python及第三方库交叉编译


一、前言:

  网上关于python的交叉编译的文章很多,但是关于python第三库的交叉编译的文章就比较少了,而且很多标题是第三方库的交叉编译,但是实际上用到的都是不需要交叉编译就能用的库,可参考性不强,最近关于python及其第三方库的交叉编译也踩了不少坑,记录一下!

二、交叉编译介绍:

  1、什么是交叉编译:在一个平台上生成另一个平台上的可执行代码。

  2、为什么要交叉编译:在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的ARM 平台,其一般的静态存储空间比较小,而CPU运算能力弱。这种情况下,在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

  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搭建python-target的运行虚拟环境

  6、在crossenv虚拟环境中通过pip打包交叉编译第三方库为.whl形式的

六、准备交叉编译工具

  1、解压交叉编译链:说明不同的平台的使用的交叉编译链不同,但是思路和步骤是一样的。

    tar jxvf rv1126-arm-buildroot-linux-gnueabihf-toolchain.tar.bz2

    解压之后得到一个名为 host 的文件夹。

  2、进入 host 目录: cd host

  3、执行 relocate-sdk.sh 指令:  ./relocate-sdk.sh (不是所有交叉编译链都需要这一步的)

  4、将交叉编译链添加到环境变量:vim /etc/profile

  5、在最后添加:export PATH=$PATH:/home/host/bin  这里的路径根据自己实际的路径进行修改即可。

  6、重新加载环境变量:source /etc/profile

  7、测试:arm-buildroot-linux-gnueabihf-gcc -v  

   

七、准备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文件夹  

  6、因为安装的ubuntu18中默认的openssl是1.1.1,我们需要换成我们的openssl-1.0.2g

      把以前的备份: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

  8、编辑链接文件:vim /etc/ld.so.conf.d/libc.conf

  9、在libc.conf文件中添加:/usr/openssl-1.0.2g-build/openssl-build/lib  

  10、重新加载配置:ldconfig

  11、测试:openssl version ,已经变成1.0.2g版本了

    python及第三方库交叉编译
八、准备openssl-target

  1、同样是再次解压openssl源码包,这次解压的源码包用来交叉编译给target-python使用的:tar -xzvf openssl-1.0.2g.tar.gz

  2、更改名字:mv openssl-1.0.2g openssl-1.0.2g-target

  3、cd openssl-1.0.2g-target

  4、设置编译环境:./config no-asm –shared –cross-compile-prefix=arm-buildroot-linux-gnueabihf- –prefix=/home/openssl-1.0.2g-target/openssl-target

    解释: no-asm :加上 no-asm 表示不使用汇编代码加速编译,不然会报错

       –cross-compile: 指定交叉编译链的前缀,这样在交叉编译openssl就会使用我们的交叉编译链进行交叉编译了

        –prefix: 已经是交叉编译后的路径

  5、在编译后生成的Makefile中有两处是 -m64 的标记要删除,因为交叉编译后是在32位的板子上运行,所以这一步也要改:sed -i 's/-m64//' Makefile

  6、执行编译安装:make && make install

  目前我们就把openssl-build和openssl-target都准备好了

九、准备zlib-build

  1、解压源码包:unzip zlib1211.zip

  2、改名:mv zlib-1.2.11 zlib-1.2.11-build

  3、cd zlib-1.2.11-build

  4、设置编译环境:./configure –prefix=/home/zlib-1.2.11-build/zlib-build

  5、执行编译安装:make && make install

十、准备zlib-target

  1、解压源码包:unzip zlib1211.zip

  2、改名:mv zlib-1.2.11 zlib-1.2.11-target

  3、cd zlib-1.2.11-target

  4、设置交叉编译器:export CC=arm-buildroot-linux-gnueabihf-gcc 通过export 设置的环境变量都是临时一次性的,当shell窗口关闭了就失效了

  5、设置编译环境:./configure –prefix=/home/zlib-1.2.11-target/zlib-target –enable-shared

  6、执行编译安装:make && make install

  目前我们也已经包zlib-build和zlib-target准备好了

十一、准备ctypes-build

   这一步已经在准备工作中做了:sudo apt-get install libffi-dev  

十二、准备ctypes-target

  1、解压源码包:tar -xzvf libffi-3.2.1.tar.gz

  2、改名:mv libffi-3.2.1 libffi-3.2.1-target

  3、cd libffi-3.2.1-target

  4、设置交叉编译器:export CC=arm-buildroot-linux-gnueabihf-gcc 如果这一步在准备zlib-target没有关闭shell窗口的时候,可以不用设置,因为已经设置过了,但是如果关了窗口就要重新设置了

  5、设置编译环境:./configure CC=arm-buildroot-linux-gnueabihf-gcc –host=arm-buildroot-linux-gnueabihf –build=x86_64-linux-gnu target=arm-buildroot-linux-gnueabihf –enable-shared –prefix=/home/libffi-3.2.1-target/libffi-target

  6、执行编译安装:make && make install

  目前ctypes-build和ctypes-target也准备好了

十三、编译python-build

  1、解压源码:tar xvf Python-3.5.2.tgz 

  2、改名:mv Python-3.5.2 python-3.5.2-build

  3、cd /home/python-3.5.2-build

  4、修改 Modules/Setup.dist文件:vim Modules/Setup.dist

  5、将之前设置的交叉编译器改为默认的编译器:export CC=   这里=后面什么都不赋值就表示设置为空,这样就会去找默认的gcc了

  6、设置编译环境,./configure –prefix=/home/python-build –without-ensurepip

  7、执行安装编译:make && make install

  8、cd /home/python-build/bin

  9、下载pip文件:curl https://bootstrap.pypa.io/pip/3.5/get-pip.py -o get-pip.py -k

  10、安装pip: ./python3 get-pip.py

  11、将该python-build添加到环境变量,设置为build主机上默认的python:  export PATH=/home/python-build/bin:$PATH

  12、安装Cython: pip3 install Cython

  13、测试:python3

本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;

2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;

3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;

4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;

5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/294485.html

(0)
上一篇 2022年12月3日
下一篇 2022年12月3日

相关推荐

发表回复

登录后才能评论