Ubuntu平台使用aarch64-Linux交叉编译opencv库并移植RK3588S边缘端
Ubuntu平台使用aarch64-Linux交叉编译opencv库并移植ARM边缘端
- 安装交叉编译器
- 安装OpenCV
- 安装opencv依赖的库
- 修改aarch64-gnu.toolchain.cmake
- 编译OpenCV库
- 编译版本环境配置(默认环境不需要此步骤):
- 创建CMakeLists.txt
英伟达的嵌入式板作为边缘端设备为算法模型的部署提供了便利,目前很多分类或好检测模型针对边缘端做了优化或量化,使得在边缘端也能达到实时稳定的识别和检测效果,常用的嵌入式设备有Nvidia系列的TX2,Xavier NX,Xavier AGX等。
但嵌入式设备普遍的flash emmc不大,一般在32G左右,如果在嵌入式设备进行大量的编译操作很容易空间不足,最近由于部署需要,在Xavier AGX上编译opencv的时候提示No space on the device,从而导致编译失败,因此通过查阅官方文档大小可以通过交叉编译的方式避免文件包在嵌入式上编译,可以通过在x86 pc端进行交叉编译,然后将编译好的文件夹拷贝到ARM设备即可,
安装交叉编译器
以gcc-aarch64-linux-gnu为例 (aarch64-linux-musleabi-gcc也可以 下载地址)
1.Linux x86下安装ARM架构下的编译器
apt-cache search aarch64sudo apt-get install build-essential
sudo apt-get install g++-aarch64-linux-gnu
sudo apt-get install gcc-aarch64-linux-gnu
下载后在终端输入以下指令查看编译器版本 确认 aarch64-linux-gnu 交叉编译工具链生效
aarch64-linux-gnu-g++ -v
aarch64-linux-gnu-gcc -v
内容记录:
(RKNN_Toolkit2_py3.10) ubuntu20@WIN11DC:~/opencv-4.5.5/build$ aarch64-linux-gnu-g++ -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/9/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --without-target-system-zlib --enable-libpth-m2 --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux-gnu- --includedir=/usr/aarch64-linux-gnu/include
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)(RKNN_Toolkit2_py3.10) ubuntu20@WIN11DC:~/opencv-4.5.5/build$ aarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/9/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --without-target-system-zlib --enable-libpth-m2 --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux-gnu- --includedir=/usr/aarch64-linux-gnu/include
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)
安装OpenCV
安装opencv依赖的库
sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
OpenCV包
编译版本注意:编译安装地址不是默认的/usr/local,而是自行指定的文件夹,这样不会产生任何冲突 (最好选择默认路径)
修改aarch64-gnu.toolchain.cmake
在opencv-4.9.0下
修改~/opencv-4.9.0/platforms/linux/aarch64-gnu.toolchain.cmake
修改为:
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version")
set(GNU_MACHINE "aarch64-linux-gnu" CACHE STRING "GNU compiler triple")
include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake")
#set(WITH_CAROTENE OFF)
#set(WITH_ITT OFF)
#set(WITH_OPENCL OFF)
#set(WITH_ADE OFF)
编译OpenCV库
下载源代码并解压 opencv-4.9.0.tar.gz
tar -xzvf opencv-4.9.0.tar.gz
在源代码的文件夹 opencv-4.9.0下开始编译
mkdir build && cd build # 创建一个build文件夹并进入
# mkdir aarch_64_install
# 生成静态库(.a) 不过使用静态库,静态连接,这样应用程序体积会比较大
cmake \
-DCMAKE_TOOLCHAIN_FILE=/home/ubuntu20/opencv-4.9.0/platforms/linux/aarch64-gnu.toolchain.cmake \
-D CMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS="aarch64-linux-gnu -a --static"
-DCMAKE_C_FLAGS="aarch64-linux-gnu -a --static"
-DBUILD_SHARED_LIBS=OFF
-DCMAKE_INSTALL_PREFIX=/usr/local ..# 生成动态库(.so)
cmake \
-DCMAKE_TOOLCHAIN_FILE=/home/ubuntu20/opencv-4.9.0/platforms/linux/aarch64-gnu.toolchain.cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS="aarch64-linux-gnu"
-DCMAKE_C_FLAGS="aarch64-linux-gnu"
-DBUILD_SHARED_LIBS=ON
-DWITH_ADE=OFF
-DCMAKE_INSTALL_PREFIX=/usr/local ..# 生成(.a .so) 注意路径,修改路径
cmake \
-DCMAKE_TOOLCHAIN_FILE=/home/ubuntu20/opencv-4.9.0/platforms/linux/aarch64-gnu.toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=/home/ubuntu20/opencv-4.9.0/build/install \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_BUILD_TYPE=Release ..
make -j8
sudo make install
在嵌入式设备上,可能需要更新LD_LIBRARY_PATH等环境变量,确保系统能找到新安装的库。
编译版本环境配置(默认环境不需要此步骤):
这是命令
echo "export OpenCV_DIR=/home/ubuntu20/opencv-4.9.0/build/install/lib/cmake/opencv4" >> ~/.bashrc
echo "export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/home/ubuntu20/opencv-4.9.0/build/install/lib" >> ~/.bashrc
这是用gedit打开.bashrc
#打开~/.bashrc
gedit ~/.bashrc
#在文件末尾增加以下内容
export OpenCV_DIR=/home/ubuntu20/opencv-4.9.0/build/install/lib/cmake/opencv4
LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/home/ubuntu20/opencv-4.9.0/build/install/lib
#更新~/.bashrc
source ~/.bashrc
创建CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(opencv_test)
set(OpenCV_DIR "/home/wlj/opencv-4.9.0/build")
find_package(OpenCV 4.9.0 REQUIRED)
add_executable(cv cv.cpp)
target_link_libraries(cv ${OpenCV_LIBRARIES})
---非内部编译库需要添加此步---
#这些install()指令用于在构建过程的最后阶段将目标文件、库和其他资源安装到指定的目录
# install target and libraries
#set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install/rknn_yolov5_demo_${CMAKE_SYSTEM_NAME})
#install(TARGETS rknn_yolov5_demo DESTINATION ./)
#install(PROGRAMS ${OpenCV_LIBS} DESTINATION lib)
#install(DIRECTORY model DESTINATION ./)