在项目源码树中使用OpenCV CMake目标遇编译问题求助
问题解决:通过
add_subdirectory引入OpenCV源码构建时头文件找不到的问题 可以直接通过add_subdirectory引入OpenCV源码构建,无需提前安装。你的问题核心是OpenCV模块目标的头文件路径没有正确传递给测试项目,以下是可行的解决方案:
方案一:手动添加OpenCV的必要头目录
在链接目标后,添加OpenCV源码中的顶级include目录,以及构建时生成的include目录(存放自动生成的配置文件):
add_executable(testproject main.cpp) target_link_libraries(testproject PRIVATE opencv_core) # 添加OpenCV的头文件目录 target_include_directories(testproject PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/opencv/include ${CMAKE_CURRENT_BINARY_DIR}/opencv/include )
方案二:使用OpenCV自动定义的OpenCV_INCLUDE_DIRS变量
OpenCV在add_subdirectory执行完成后,会自动设置OpenCV_INCLUDE_DIRS变量,包含所有必要的头文件路径,直接引用即可:
add_executable(testproject main.cpp) target_link_libraries(testproject PRIVATE opencv_core) target_include_directories(testproject PRIVATE ${OpenCV_INCLUDE_DIRS})
方案三:使用opencv_world目标(推荐)
如果希望简化依赖管理,可以启用OpenCV的opencv_world目标,它会将所有模块打包成一个单一目标,自动处理所有头文件和链接依赖:
cmake_minimum_required(VERSION 3.22) project(my-opencv-project) # 启用opencv_world,同时关闭其他不必要的构建选项 set(BUILD_SHARED_LIBS OFF) set(BUILD_PERF_TESTS OFF) set(BUILD_TESTS OFF) set(BUILD_opencv_world ON) # 新增这一行 add_subdirectory(opencv) add_executable(testproject main.cpp) # 只需要链接opencv_world即可 target_link_libraries(testproject PRIVATE opencv_world)
验证目标属性(排查问题用)
如果上述方案无效,可以先检查opencv_core目标的头文件路径是否正确:
get_target_property(CORE_INCLUDES opencv_core INTERFACE_INCLUDE_DIRECTORIES) message(STATUS "opencv_core includes: ${CORE_INCLUDES}")
执行CMake配置后,查看输出的路径是否包含OpenCV的顶级include目录和构建生成的include目录,如果缺失,手动添加即可。
内容的提问来源于stack exchange,提问作者NoodleCollie
相关产品推荐
相关产品推荐

