目录
一、前言:
二、交叉编译介绍:
三、python及其第三方库的交叉编译背景
四、交叉编译的准备工作
五、交叉编译python及其第三方的思路
六、准备交叉编译工具
七、准备openssl-build
八、准备openssl-target
九、准备zlib-build
十、准备zlib-target
十一、准备ctypes-build
十二、准备ctypes-target
十三、编译python-build
十四:编译python-targer
十五、通过crossenv交叉编译第三方库例如:numpy
十六、移植到目标板子
首页 后端开发 Python教程 关于python中第三方库交叉编译的问题

关于python中第三方库交叉编译的问题

Oct 05, 2022 am 08:00 AM
python

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于第三方库交叉编译的问题,交叉编译指的是在一个平台上生成另一个平台上的可执行代码,下面一起来看一下,希望对大家有帮助。

关于python中第三方库交叉编译的问题

【相关推荐:Python3视频教程

一、前言:

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

  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版本了

八、准备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

    a、修改关于openssl部分

    b、修改关于zlib部分

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

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

     --without-ensurepip:不安装pip,因为默认安装的pip版本太低了,所以一会我们自己安装pip

  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

十四:编译python-targer

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

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

  3、cd python-3.5.2-target

  4、创建文件夹:mkdir /home/python-target

  5、将之前准备的openssl-targer、zlib-targer、cytpes-targer的头文件和链接库复制到/home/python-targer

    cp -rfp /home/zlib-1.2.11-target/zlib-target/* /home/python-target/

    cp -rfp /home/libffi-3.2.1-target/libffi-target/* /home/python-target/

    cp -rfp /home/openssl-1.0.2g-target/openssl-target/* /home/python-target/

  6、设置CFLAGS:CFLAGS="-I/home/python-target/include -I/home/python-target/include/python3.5m -L/home/python-target/lib"

  7、设置LDFLAGS:LDFLAGS="-L/home/python-target/lib"

  8、vim Modules/Setup.dist

  9、设置编译环境:注意这里我为了方便看,手动的给每个参数换行了,实际使用中不应该换行的

./configure CC=arm-buildroot-linux-gnueabihf-gcc 
CXX=arm-buildroot-linux-gnueabihf-g++ 
AR=arm-buildroot-linux-gnueabihf-ar 
RANLIB=arm-buildroot-linux-gnueabihf-ranlib 
--host=arm-buildroot-linux-gnueabihf 
--build=x86_64-linux-gnu 
--target=arm-buildroot-linux-gnueabihf 
--disable-ipv6 
ac_cv_file__dev_ptmx=yes 
ac_cv_file__dev_ptc=yes 
--prefix=/home/python-target 
--without-ensurepip
登录后复制

  10、编译:make HOSTPYTHON=/home/python-build/bin/python3 HOSTPGEN=/home/python-3.5.2-build/Parser/pgen

  11、执行:make install HOSTPYTHON=/home/python-build/bin/python3

  目前位置我们就在build主机上已经编译好了python-build和python-target

十五、通过crossenv交叉编译第三方库例如:numpy

  1、在build主机上使用python-build搭建python-target的虚拟环境,然后再虚拟环境中打包python-target的第三方库,这里以numpy为例:因为numpy是需要经过交叉编译才能使用的。

  2、cd /home/python-build/bin

  3、安装crossenv:./pip3 install crossenv

  4、使用crossenv代表python-target的虚拟环境:./python3 -m crossenv --without-pip /home/python-target/bin/python3 cross_venv

  5、cd cross_venv/cross/bin

  6、激活虚拟环境:source activate

  7、curl https://bootstrap.pypa.io/pip/3.5/get-pip.py -o get-pip.py -k

  8、./python3 get-pip.py

  9、在cross_venv这个虚拟环境中的安装Cython:./pip3 install Cython

  10、创建文件夹用来存放编译后的第三方:mkdir /home/target_lib

  11、创建requestments.txt:vim requirements.txt 里面写上numpy

  12、交叉编译第三方库成为.whl格式的安装包:./pip3 wheel --wheel-dir /home/target_lib -r requirements.txt

  13、验证:cd /home/target_lib

  14、注意,这里我们使用crossenv交叉编译后的numpy第三方库的后缀是linux_arm,而我们的目标板子是armv7l的,所以这里我们要手动的将

    numpy-1.18.5-cp35-cp35m-linux_arm.whl改为numpy-1.18.5-cp35-cp35m-linux_armv7l.whl。不然会报错。这个坑,一直坑了我一个月的时间,尝试了很多方法,不知道是编译链的问题,还是编译过程的问题。将交叉编译后的numpy的.whl文件移植到目标板子的中,总是报错,突然灵光一闪,就手动改个名字,居然可以了,这坑简直是巨坑,坑了一个月的时间。

十六、移植到目标板子

  将编译好的python-target打包 和 numpy-1.18.5-cp35-cp35m-linux_arm.whl(先不改名,移植到目标板子上在改名)移植到目标板子上

  1、压缩python-target:tar cvf python-target.tar python-target

  2、通过ftp工具,将python-target.tar和numpy-1.18.5-cp35-cp35m-linux_arm.whl ,移植到目标板子的/home下

  3、解压python-target:tar xvf python-target.tar

  4、cd /home/python-target/bin

  5、验证在目标板子上运行python3

  6、验证交叉编译的第三方

    1、先下载pip:curl https://bootstrap.pypa.io/pip/3.5/get-pip.py -o get-pip.py -k

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

    3、配置pip源

      a、mkdir ~/.pip

      b、vi ~/.pip/pip.conf

      c、添加如下代码

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple 
trusted-host = pypi.tuna.tsinghua.edu.cn
登录后复制

    4、验证pip

    5、通过pip安装未改名的numpy第三方库:这是会报错:numpy-1.18.5-cp35-cp35m-linux_arm.whl is not a supported wheel on this platform.

    6、改名:mv /home/numpy-1.18.5-cp35-cp35m-linux_arm.whl /home/numpy-1.18.5-cp35-cp35m-linux_armv7l.whl

     7、重新安装验证:        

到此python3及python需要的第三方库,类似numpy这样需要交叉编译的第三方库就完成了!其中其他库不一定都是完全一样的,但是大致流程是一样的可以参考借鉴。

【相关推荐:Python3视频教程

以上是关于python中第三方库交叉编译的问题的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
2 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

手机XML转PDF,转换速度快吗? 手机XML转PDF,转换速度快吗? Apr 02, 2025 pm 10:09 PM

手机XML转PDF的速度取决于以下因素:XML结构的复杂性手机硬件配置转换方法(库、算法)代码质量优化手段(选择高效库、优化算法、缓存数据、利用多线程)总体而言,没有绝对的答案,需要根据具体情况进行优化。

怎么在手机上把XML文件转换为PDF? 怎么在手机上把XML文件转换为PDF? Apr 02, 2025 pm 10:12 PM

不可能直接在手机上用单一应用完成 XML 到 PDF 的转换。需要使用云端服务,通过两步走的方式实现:1. 在云端转换 XML 为 PDF,2. 在手机端访问或下载转换后的 PDF 文件。

C语言 sum 的作用是什么? C语言 sum 的作用是什么? Apr 03, 2025 pm 02:21 PM

C语言中没有内置求和函数,需自行编写。可通过遍历数组并累加元素实现求和:循环版本:使用for循环和数组长度计算求和。指针版本:使用指针指向数组元素,通过自增指针遍历高效求和。动态分配数组版本:动态分配数组并自行管理内存,确保释放已分配内存以防止内存泄漏。

xml怎么转换成图片 xml怎么转换成图片 Apr 03, 2025 am 07:39 AM

可以将 XML 转换为图像,方法是使用 XSLT 转换器或图像库。XSLT 转换器:使用 XSLT 处理器和样式表,将 XML 转换为图像。图像库:使用 PIL 或 ImageMagick 等库,从 XML 数据创建图像,例如绘制形状和文本。

有没有手机APP可以将XML转换成PDF? 有没有手机APP可以将XML转换成PDF? Apr 02, 2025 pm 09:45 PM

没有APP可以将所有XML文件转成PDF,因为XML结构灵活多样。XML转PDF的核心是将数据结构转换为页面布局,需要解析XML并生成PDF。常用的方法包括使用Python库(如ElementTree)解析XML,并利用ReportLab库生成PDF。对于复杂XML,可能需要使用XSLT转换结构。性能优化时,考虑使用多线程或多进程,并选择合适的库。

xml格式化工具推荐 xml格式化工具推荐 Apr 02, 2025 pm 09:03 PM

XML格式化工具可以将代码按照规则排版,提高可读性和理解性。选择工具时,要注意自定义能力、对特殊情况的处理、性能和易用性。常用的工具类型包括在线工具、IDE插件和命令行工具。

如何在手机上高质量地将XML转换成PDF? 如何在手机上高质量地将XML转换成PDF? Apr 02, 2025 pm 09:48 PM

在手机上高质量地将XML转换成PDF需要:使用无服务器计算平台在云端解析XML并生成PDF。选择高效的XML解析器和PDF生成库。正确处理错误。充分利用云端计算能力,避免在手机上进行繁重任务。根据需求调整复杂度,包括处理复杂的XML结构、生成多页PDF和添加图片。打印日志信息以帮助调试。优化性能,选择高效的解析器和PDF库,并可能使用异步编程或预处理XML数据。确保良好的代码质量和可维护性。

如何在安卓手机上将XML转换成PDF? 如何在安卓手机上将XML转换成PDF? Apr 02, 2025 pm 09:51 PM

直接在安卓手机上将 XML 转换为 PDF 无法通过自带功能实现。需要通过以下步骤曲线救国:将 XML 数据转换为 PDF 生成器识别的格式(如文本或 HTML);使用 HTML 生成库(如 Flying Saucer)将 HTML 转换为 PDF。

See all articles