RV1126 NO.34:OPENCV的交叉编译和项目Makefile讲解
一.OPENCV交叉编译的步骤
前言:在交叉编译之前需要把交叉编译工具链安装好,在我们Ubuntu里面它放在/opt目录里面,如下图:

交叉编译工具是:
/opt/rv1126_rv1109_linux_sdk_v1.8.0_20210224/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin
1.1 解压并且打开opencv目录
先用unzip opencv-3.4.16.zip来解压opencv的压缩包,并且打开opencv目录(cd opencv-3.4.16)如下图
![]()
1.2 修改opencv的cmake脚本的内容
先cd platforms/linux然后修改arm-gnueabi.toolchain.cmake文件(vim arm-gnueabi.toolchain.cmake )如下图:
![]()
内容修改如下:

这里的修改关键是第二个,需要把RV1126的交叉编译工具链写上去
set(GNU_MACHINE "/opt/rv1126_rv1109_linux_sdk_v1.8.0_20210224/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf" CACHE STRING "GNU compiler triple")
1.3. 在opencv-3.4.16的目录建立build
![]()
在这个目录下使用mkdir build建立编译目录
1.4. 进入build目录进行cmake配置
![]()
在build目录下使用配置命令:
cmake -DCMKAE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake -DCMAKE_INSTALL_PREFIX=/opt/arm_opencv_source -DSOFTFP=ON -DENABLE_PROFILING=OFF -DWITH_OPENCL=OFF -DWITH_TBB=ON -DWITH_V4L=ON -DHAVE_CAMV4L2=ON -DBUILD_TESTS=OFF -DINSTALL_PYTHON_EXAMPLES=OFF -DBUILD_EXAMPLES=OFF -DWITH_FFMPEG=ON -DHAVE_FFMPEG=ON -DBUILD_opencv_js=OFF -DENABLE_NEON=OFF -DENABLE_VFPV3=OFF ../
这里配置安装的目录是/opt/arm_opencv_source,若配置成功则会有以下打印:

1.5. 编译opencv的动态库
配置完成之后则先用用make进行编译(这里用make -j8),如下图:
![]()
当make成功的话,则会出现下面的图

1.6. 安装opencv的动态库
当编译完成之后,则需要使用make install安装动态库,如下图:

最终把动态库安装到/opt/arm_opencv_source里面,如下图:

bin:可执行文件文件
include:Opencv的头文件
lib:opencv的交叉编译动态库
share:一些共享的数据,通常无需关注
1.7. 把交叉编译的动态库拷贝到RV1126的板子里面

(图1)

(图二)
最后把Ubuntu交叉编译的动态库(图一)拷贝到板子的/usr/lib目录里面(图二),此时RV1126的板子就可以直接使用OPENCV功能了
二.Makefile的讲解

上图是Makefile的具体内容,后面OPENCV都是参照这个语法去进行编译。它的基本语法是:
$(G++) xxx.cpp $(CFLAGS) $(LIB_FILES) $(LIB_FLAGS) -o xxx
$(G++):RV1126的交叉编译工具链,这里是:
/opt/rv1126_rv1109_linux_sdk_v1.8.0_20210224/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++
$(CFLAGS):项目包含的头文件,最主要的包括rkmedia的头文件(-I./include/rkmedia) 、rknn的头文件(-I./rknn_rocx_include)、OPENCV的头文件(-I./arm_opencv_source/include), 其他的include没怎么用到。
$(LIBS_FILES): 项目包含的库目录,包括了RV1126的库(-L./rv1126_lib)、sqlite3的库(-L./sqlite3_source/lib)、opencv的动态库(-L./arm_opencv_source/lib)
$(LD_FLAGS):动态库的链接,这里包括了Opencv的链接(-lopencv_开头的库)、rkmedia的动态库链接(-ldrm、 -leasymedia、-lrockchip_mpp)等等。
-o:输出的可执行文件
