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