STM32MP135移植Python3.6.9并移植第三方库(zlib,openssl,libffi,numpy,opencv-python)

参考文献

python3.7移植到ARM开发板_arm linux 安装python3.7-CSDN博客

在ubuntu中,交叉编译harfbuzz,freetype,opencv(包括WITH_QT),并移植到linux开发板_opencv交叉编译-lfreetype-CSDN博客

linux开发板,交叉编译opencv时,添加python支持_linux 编译 python opencv-CSDN博客

Python3交叉编译步骤(二)-三方库的交叉编译 – 秀才哥哥 – 博客园

嵌入式linux开发板,通过crossenv交叉编译python第三方库numpy_python程序交叉编译部署到开发板上-CSDN博客

平台环境

  • 主机环境:Ubuntu 18.04.6 LTS

  • 开发板:正点原子STM32MP135(cortex-A7,armv7l)

  • 交叉编译工具链:arm-buildroot-linux-gnueabihf-

  • python版本:3.6.9

  • 交叉编译工具链

    该实验交叉编译工具链使用正点原子提供的arm-buildroot-linux-gnueabihf,未自行制作交叉编译工具链,且环境变量已正确配置。

    python准备

    将python交叉编译后移植到arm开发板上面,需要两个版本的python:一个是安装在ubuntu上面的host版本的,另一个是交叉编译后能够在arm上面正常运行的。

    下载python3.6.9源码

    得到压缩包Python-3.6.9.tar.xz

    源码解压

     xz -d Python-3.6.9.tar.xz  /* 解压为tar文件 */
     tar xvf Python-3.6.9.tar 

    相关环境依赖安装

     sudo apt-get install openssl
     sudo apt-get install libssl-dev
     sudo apt-get install gcc make cmake
     sudo apt-get update

    第三方库安装

    zlib

    下载zlib源码:zlib

     tar xvf zlib-1.2.11.tar.gz
     cd zlib-1.2.11
     CC=arm-buildroot-linux-gnueabihf-gcc ./configure --prefix=/home/alientek/linux/arm_borad/arm/
     make
     make install
    openssl

    需要用到https场景需要安装该库

    下载openssl源码:openssl

     tar xvf openssl-OpenSSL_1_1_1d.tar.gz
     cd openssl-OpenSSL_1_1_1d.tar.gz
     ./config no-asm --prefix=/home/alientek/linux/arm_borad/arm/ --cross-compile-prefix=arm-buildroot-linux-gnueabihf-
     make
     注:此处将会报错,需要手动修改Makefile文件,删除部分内容
     vi Makefile
     手动删除两处 -m64
     make
     make install
    libffi

    需要用到_ctypes模块需要安装该库

    下载libffi源码:libffi

     tar xvf libffi-3.2.1.tar.gz
     cd libffi-3.2.1
     CC=arm-buildroot-linux-gnueabihf-gcc ./configure --host=arm-buildroot-linux-gnueabihf --prefix=/home/alientek/linux/arm_borad/arm/
     可能出现报错‘makeinfo‘ is missing on your system
     可以使用以下命令安装第三方库解决
     sudo apt-get install texinfo
     CC=arm-buildroot-linux-gnueabihf-gcc ./configure --host=arm-buildroot-linux-gnueabihf --prefix=/home/alientek/linux/arm_borad/arm/
     make
     make install

    开启依赖

    zlib
     cd Python-3.6.9
     cd Modules
     vi Setup.dist
     将下面这行代码注释取消
     zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib –lz
    openssl
     cd Python-3.6.9
     cd Modules
     vi Setup.dist
     将下面四行代码注释取消
     SSL=$(prefix)
     _ssl _ssl.c \
             -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
             -L$(SSL)/lib -lssl –lcrypto
    libffi
     export PKG_CONFIG_PATH=/home/alientek/linux/arm-board/arm/lib/pkgconfig:$PKG_CONFIG_PATH

    编译本机python解释器

    在交叉编译的时候需要在主机上运行对应版本的Python程序,所以需要先编译主机上面使用的Python解释器

     cd Python-3.6.9
     ./configure --prefix=$PWD/../_install_host --enable-shared LDFLAGS="-L/home/alientek/linux/arm-board/arm/lib" CPPFLAGS="-I/home/alientek/linux/arm-board/arm/include"
     make -j6
     make install
     make distclean
     ​
     make的时候会出现 subprocess.CalledProcessError: Command '('lsb_release', '-a')' returned non-zero exit status 1的问题,暴力的解决办法是直接删除lsb_release文件,rm /usr/bin/lsb_release

    注:–prefix指定的目录可自行修改,但不要放在Python-3.6.9目录里,因为后续执行make distclean会清掉一些文件

    将生成的主机端的python解释器目录中的/bin文件和/lib文件的路径添加到环境变量中,后续在执行交叉编译的时候就可以自动找到该版本的python3了(如果主机上有多个python解释器,自行探索解决办法)

     sudo gedit ~/.bashrc
     export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/alientek/linux/arm-board/arm/lib
     export PATH=$PATH:/home/alientek/linux/arm-board/arm/bin

    交叉编译开发板端python解释器

     cd  Python-3.6.9
     make clean # 清除编译主机python解释器生成的一些文件
     mkdir build-arm
     cd build-arm
     ​
     ../configure CC=arm-buildroot-linux-gnueabihf \
     CXX=CC=arm-buildroot-linux-gnueabihf-g++ \
     --host=arm-buildroot-linux-gnueabihf \
     --build=x86_64-linux-gnu \
     --target=arm-buildroot-linux-gnueabihf --disable-ipv6 \
     --prefix=/home/alientek/linux/arm-board/arm \
     ac_cv_file__dev_ptmx=yes ac_cv_file__dev_ptc=yes
     ​
     make -j6
     make install

    交叉编译numpy

    注:与参考文章不同的是没有使用curl下载pip工具,而是离线安装,该文件在文件夹中已提供

     ubuntu操作如下:
     ubuntu上安装crossenv:pip3 install crossenv
     使用crossenv代表开发板上python的虚拟环境:python3 -m crossenv --without-pip /home/alientek/linux/arm-board/arm/bin/python3 cross_venv
     cd cross_venv/cross/bin
     激活虚拟环境:source activate(退出虚拟环境:deactivate)
     安装pip3:./python3 get-pip.py(已将get-pip.py文件上传到当前文件夹下)
     在cross_venv这个虚拟环境中的安装Cython:./pip3 install Cython
     创建requestments.txt:vi requirements.txt, 里面写上numpy及版本号
     例如:numpy==1.13.3
     交叉编译numpy成为.whl格式的安装包:./pip3 wheel --wheel-dir /home/alientek/linux/arm-board/arm-pylib -r requirements.txt
     得到文件:numpy-1.13.3-cp36-cp36m-linux arm.whl
     因为我们的平台架构是armv7l,故重命名为:numpy-1.13.3-cp36-cp36m-linux_armv7l.whl
     注:查看linux开发板架构,在开发板命令端使用命令:uname -a
     ​
     开发板上操作如下:
     将numpy-1.13.3-cp36-cp36m-linux_armv7l.whl移植到目录/home/alientek/linux/arm-board/arm/bin下
     安装pip3:./python3 get-pip.py(已将get-pip.py文件上传到当前文件夹下)
     验证pip3:./pip3 list
     安装numpy:./pip3 install numpy-1.13.3-cp36-cp36m-linux_armv7l.whl

    交叉编译opencv(依赖numpy)

    说明

    本试验使用cmake-gui进行构建,故需要先安装cmake,cmake的安装方法参考其它博客,该实验使用的cmake版本为:cmake-3.24

    opencv源码获取

    下载opencv源码:本试验使用的opencv版本为opencv-4.5.5

     unzip opencv-4.5.5.zip
     cd opencv-4.5.5
     mkdir build
    构建opencv-python
     ./cmake-gui .
    
     修改CMAKE_BUILD_TYPE为Release
     勾选OPENCV_GENERATE_PKGCONFIG,这是生成.pc文件的选项。pc文件保存了该库的头文件、库所在的路径信息
     勾选BUILD_TIFF
     勾选BUILD_JPEG
     勾选BUILD_PNG
     勾选WITH_OPENGL
     勾选BUILD_ZLIB
     增加Entry,ZLIB_LIBRARY_RELEASE:/home/alientek/linux/arm-board/arm/lib/libz.so
     选择opencv安装目录:CMAKE_INSTALL_PREFIX:/home/alientek/linux/arm-board/arm
     勾选ENABLE_NEON
     增加Entry,CMAKE_EXE_LINKER_FLAGS:-lpthread -ldl -lrt
     取消WITH_1394
     取消WITH_WEBP
     增加Entry,BUILD_opencv_python3:勾选
     添加交叉编译的python的相关路径,注意删除cmake自带的python2的相关路径,结果如下图所示
     增加Entry,PYTHON3_INCLUDE_PATH:/home/alientek/linux/arm-board/arm/include/python3.6m
     增加Entry,PYTHON3_LIBRARIES:/home/alientek/linux/arm-board/arm/lib/libpython3.6m.a
     点击Configure,python部分结果应该如图所示(python的Libraries和install path应该正确识别)
     点击Generate
     cd /home/alientek/linux/nfs/opencv-4.5.5/build
     make -j6
     make install
     结果是在/home/alientek/linux/arm_board/arm/lib/python3.6/site-packages目录下应该有cv2文件夹,并且该文件夹下cv2/python3.6有cv2.cpython-36m-arm-linux-gnueabihf.so文件

    注:出现以上图片中的警告时,可以不进行修改

    注:在开发板上执行python3 import cv2之前,需要将我们编译库文件添加到环境变量中,才能正确读取库文件信息:

    export LD_LIBRARY_PATH=/python/1203/arm/lib:$LD_LIBRARY_PATH

    作者:m0_51213870

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32MP135移植Python3.6.9并移植第三方库(zlib,openssl,libffi,numpy,opencv-python)

    发表回复