opencv交叉编译 和 The C/C++ compiler is not able to compile a simple test program.


目录

一、常见问题

二、OpenCV交叉编译

三、补充说明

1. pkgconfig配置(非必须)

2. CMakeLists.txt文件使用opencv

3. 配置目标平台运行可执行程序时opencv动态库搜索路径


主机环境:Ubuntu 18.04.6 LTS,x86_64

目标平台:Qualcomm apq8096,AArch64

CMake版本:3.10.2

OpenCV版本:https://github.com/opencv/opencv (4.5.3)


一、常见问题

1. The c/c++ compiler is not able to compile a simple test program.

 如果在PC上将交叉编译环境配置正确,该问题其实一般不会遇到。若遇到可通过设置CMAKE_SYSROOT来解决(该变量与标志“--sysroot”对应),设置值是交叉编译工具链root目录,参见第二节Step2。

 注意CMAKE_SYSROOT据说在cmake3.0及以上版本才支持!

2. 提示警告“CMAKE_SYSTEM_PROCESSOR is not defined”。以及make后,编译过程出现某个模块不通过。这两类问题其实就是一个问题,笔者将在本文第二节Step3指出规避方案。

二、OpenCV交叉编译

借助cmake-gui,本节将交叉编译过程分为六个步骤进行详细介绍。

Step1: 指定构建目录

Step2:  设定CMAKE_SYSROOT(一般不需要,若出现上一节问题1时就需要手动设置)

笔者交叉编译工具链目录结构:

Step3:  指定CMAKE_TOOLCHAIN_FILE

该步骤很重要,而且必须在点击Configure之前配置(详见以下官方介绍)。一般编译过程出现某些模块不通过就是因为缺少该环节,以及提示警告“CMAKE_SYSTEM_PROCESSOR is not defined”也是缺少该环节。

CMAKE_TOOLCHAIN_FILE: This variable is specified on the command line when cross-compiling with CMake. It is the path to a file which is read early in the CMake run and which specifies locations for compilers and toolchain utilities, and other target platform and compiler related information.

基于笔者目标机器的交叉编译环境,笔者选择的是如下cmake文件:

 在opencv根目录platforms子目录下存放有android、apple、ios、Linux等平台的cmake文件。

Step4: 指定toolchain(点击Configure)

 然后根据个人PC所配置的交叉编译工具链,将下图所示几个框完善:

  提示1:opencv对CPU Platforms的定义如下(ARM - ARM CPU, not defined for AArch64):

  提示2:Compilers一般在交叉编译工具链根目录的bin子目录里面(笔者本文所使用交叉工具链的目录结构与此稍有区别),如下:

Step5:  修改编译配置

上一步完成后,CMake-GUI底部输出若干构建信息,可看到最终的安装位置、Release(默认)还是Debug版本、动态库(默认)还是静态库、FLAGS配置 等等。若需要修改,可勾选上下图箭头所指Advanced项(同时可点击一下Configure,因为有参数供选择的变量,未点击过Configure时参数不会扩展显示出来供选择)。

有些平日很少使用的模块,比如DNN、OpenCL(SVM)、CUDA、OpenGL、GStreamer、FFMPEG、Eigen、Protobuf、V4L以及Endian等可能默认没有配置,通过搜索关键字可以快速过滤。比较重要的是如下变量的配置(Debug对应Debug,Release对应Release,Debug版本库大小一般在200MB左右):

如果支持NEON加速,一般与之相关的变量已被设置(NEON的加速性能若想体现出来,编译优化选项至少开到O2)。但如果不被支持,可能连任何与浮点相关的计算优化均未被设置。比如笔者使用gcc-linaro-arm-linux-gnueabi-4.9.4-2017.01-x86_64交叉编译32位的库,默认既没有使能NEON,也没有使能VFPV3。通过手动配置,发现既不支持NEON,也不支持FP16,仅支持VFPV3。如下图所示:

待所需功能均配置好后,再次点击Configure,会发现CMake-GUI底部输出有红色字符串(交叉编译工具链不同,稍有差别),遇到这种情况一般是未勾选模块对应变量(根据工程需要决定是否勾选,不勾选编译一般也不会报错。不过每次构建opencv库耗时不短,建议多多益善)。

对于opencv,以下几个模块是运行强依赖的(默认也是勾选上的):

最后,点击Generate,并仔细检查CMake-GUI底部输出信息是否与自己所配置的一致,若一切正常则就可以关闭CMake-GUI。

Step6: make和install

安装目录结构(动态库版本只需将lib目录拷贝到目标机器即可):

三、补充说明

1. pkgconfig配置(非必须)

opencv库安装后,在安装目录会有四个子目录,进入lib目录,然后创建目录pkgconfig,并在里面创建文件opencv4.pc,其内容可参考如下:

prefix=/home/slf/Works/opencv-lib/opencv453-apq8096/shared  #opencv安装根目录

exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv4/opencv2
includedir_new=${prefix}/include/opencv4

Name: OpenCV
Description: Open Source Computer Vision Library shared
Version: 4.5.3
Libs: -L${exec_prefix}/lib
Libs.private: -lm -lpthread 
Cflags: -I${includedir_old} -I${includedir_new}

然后进入/etc目录打开文件profile文件,按照下图所示格式加入刚创建opencv4.pc文件所在路径(注意是给环境变量PKG_CONFIG_PATH追加字符串):

重启电脑后该设置将永久有效。若不想重启而是临时使用,可以在终端命令行执行以下命令(但也仅限当前终端有效):

source /etc/profile

echo $PKG_CONFIG_PATH  #查看设置是否有效

如此设置后在命令行即可直接通过pkg-config链接opencv库。不过当PC安装有多个版本的opencv库时,实际意义就不大了。

2. CMakeLists.txt文件使用opencv

法一:FIND_PACKAGE()

如果PC只安装一个版本的opencv,一般直接使用以下命令即可:

FIND_PACKAGE(OpenCV REQUIRED)

若PC上安装有多个版本的opencv,则在FIND_PACGAGE()之前还需设置路径:

SET(CMAKE_PREFIX_PATH "/home/slf/Works/opencv-lib/opencv453-apq8096/shared")
FIND_PACKAGE(OpenCV REQUIRED)

法二:FILE()

#静态库就将.so替换为.a
FILE(GLOB_RECURSE OpenCV_LIBS /home/slf/Works/opencv-lib/opencv453-apq8096/shared/lib/*.so*)
SET(OpenCV_INCLUDE_DIRS 
		/home/slf/Works/opencv-lib/opencv453-apq8096/shared/include
		/home/slf/Works/opencv-lib/opencv453-apq8096/shared/include/opencv4)

提示个人建议使用法二。因为当PC安装有多个版本时,项目工程目录恰也有多个CMakeLists.txt文件,且不同文件使用的opencv版本不一致,则法一可能出现多个文件最终均是使用的同一个opencv版本。此外,无论哪种方法,都应考虑规避循环依赖:

SET(LINK_LIBS
        -Wl,--start-group   # to resolve the circle dependency
        ${OpenCV_LIBS}
        pthread
        m
        dl
        -Wl,--end-group)

3. 配置目标平台运行可执行程序时opencv动态库搜索路径

/etc/ld.so.conf.d/目录下新建一个任意命名但以conf为后缀的文件,文件内容是opencv库文件所在路径。文件保存后在终端命令行执行ldconfig即可。

郑重提示:①若有疑问,可在评论区留言相互讨论。

                      ②转载注明出处,就是对笔者最大的支持!

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
这个错误是由于CMake在指定的源目录中找不到CMakeLists.txt文件引起的。根据引用\[1\]和引用\[2\]的内容,可能是由于编译MySQL或配置Opencv4时出现了问题。 对于MySQL编译的问题,根据引用\[1\]中的内容,可能是在编译之前没有正确解压MySQL的安装包,或者在指定源目录时出现了错误。你可以检查是否正确解压了MySQL的安装包,并确保在指定源目录时使用了正确的路径。 对于Opencv4配置的问题,根据引用\[2\]中的内容,可能是在配置Opencv4文件路径时出现了错误。你可以参考引用\[2\]中提供的解决办法,将Opencv文件夹中的文件剪贴到正确的位置。 总之,你需要检查你的源目录是否正确,并确保在编译或配置过程中没有出现错误。 #### 引用[.reference_title] - *1* [CMake Error: The source directory “/“ does not appear to contain CMakeLists.txt.](https://blog.csdn.net/IvyXYW/article/details/115204610)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [解决opencv CMake Error: The source directory “/home/ak/opencv“ does not appear to contain ...](https://blog.csdn.net/I_canjnu/article/details/125929900)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值