当前位置:

首页 > 编程开发 > 如何解决Python第三方库的交叉编译问题?

如何解决Python第三方库的交叉编译问题?

一、前言:  网上关于python的交叉编译的文章很多,但是关于python第三库的交叉编译的文章就比较少了,而且很多标题是第三方库的交叉编译,但是实际上用到的都是不需要交叉编译就能用的库,可参考性不强。二、交叉编译介绍:  1、什么是交叉编译:在一个平台上生成另一个平台上的可执行代码。  2、为什么要交叉编译:在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的ARM平台,其一般的静态存储空间比较小,而CPU运算能力弱。这种情况下,在ARM平台上进行本机编译就不太可能

本文目录

    一、前言:

      网上关于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

    如何解决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

      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

        a、修改关于openssl部分

    如何解决Python第三方库的交叉编译问题?

        b、修改关于zlib部分

    如何解决Python第三方库的交叉编译问题?

      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第三方库的交叉编译问题?

    十四:编译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

    如何解决Python第三方库的交叉编译问题?

    如何解决Python第三方库的交叉编译问题?

      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

    如何解决Python第三方库的交叉编译问题?

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

      13、验证:cd /home/target_lib

    如何解决Python第三方库的交叉编译问题?

      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下

    如何解决Python第三方库的交叉编译问题?

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

      4、cd /home/python-target/bin

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

    如何解决Python第三方库的交叉编译问题?

      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

    如何解决Python第三方库的交叉编译问题?

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

    如何解决Python第三方库的交叉编译问题?

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

         7、重新安装验证:        

    如何解决Python第三方库的交叉编译问题?

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python
    相关文章 更多
    python删除一个列表里的重复元素的方法与代码示例
    python删除一个列表里的重复元素的方法与代码示例

    学习如何使用Python高效删除列表中的重复元素。本文提供5种常见方法的代码示例,涵盖保持顺序与不保持顺序的场景,适合初学者和进阶开发者参考。

    Python写接口的步骤及完整代码示例
    Python写接口的步骤及完整代码示例

    详细讲解使用Python编写Web接口的核心步骤与完整代码示例,涵盖环境准备、路由定义、数据校验、服务启动及调试测试方法。

    codex怎么读取word文档及docx文件操作教程
    codex怎么读取word文档及docx文件操作教程

    介绍如何利用编程工具读取和解析Word文档(docx格式),涵盖基础文本提取代码示例、结构化数据处理逻辑,以及处理复杂排版时的技术局限与替代方案。

    怎么在Python中调用C语言代码提升性能
    怎么在Python中调用C语言代码提升性能

    详细讲解在Python中调用C语言代码提升性能的完整实践指南,包含原理分析、编译步骤、ctypes与CFFI具体实现、性能对比及常见陷阱。

    Python与C语言的性能差异及底层原理
    Python与C语言的性能差异及底层原理

    深入解析Python与C语言在执行效率上的数量级差异,从编译机制、变量内存布局、动态类型推断到GIL锁,系统阐明底层核心原理。

    Python和C语言哪个更适合编程入门
    Python和C语言哪个更适合编程入门

    客观对比Python与C语言在心智负担、底层机制与学习反馈上的核心差异,提供清晰有据的选择标准与切实的入门学习路径。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    langgraph python guide中文入门教程详解
    langgraph python guide中文入门教程详解

    本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

    Windows 安装 Python:从官方入口到虚拟环境的可复现实践
    Windows 安装 Python:从官方入口到虚拟环境的可复现实践

    面向后端开发者,基于 Python 官方文档说明如何在 Windows 上安装 Python、创建 venv 虚拟环境及使用 pip 管理依赖。包含可复制命令、验证方法及工具选择边界,避免常见配置误区。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。