CMake链接嵌套目录依赖库报错:opencv_modules.hpp未找到
OpenCV依赖配置问题:子目录库编译找不到头文件
项目结构
├── CMakeLists.txt ├── Headers │ ├── Network │ └── OCR │ ├── CMakeLists.txt │ ├── ocr.cpp │ └── ocr.hpp ├── main.cpp
根目录CMakeLists.txt配置
cmake_minimum_required(VERSION 3.18.0) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Exports json file for lsp project(ocrFoo) add_executable(${PROJECT_NAME} main.cpp) # OpenCV find_package(OpenCV REQUIRED) # X11 set(X11) link_directories(/usr/lib/X11) # Boost set(BOOST_ROOT /home/user/Libraries/Boost/boost_1_82_0) find_package(Boost 1.82.0 REQUIRED COMPONENTS system) # Threads (Boost dependecy) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) # Subdirectories (Mine) add_subdirectory(Headers/OCR) # Boost target_include_directories(${PROJECT_NAME} PUBLIC ${Boost_INCLUDE_DIR} ${OpenCV_INCLUDE_DIRS} /usr/include/X11) target_link_libraries(${PROJECT_NAME} LINK_PUBLIC ${Boost_LIBRARIES} ${OpenCV_LIBS} X11) target_link_libraries(${PROJECT_NAME} PRIVATE Threads::Threads ocr)
子目录初始CMakeLists.txt配置
add_library(ocr ocr.cpp)
编译错误信息
[ 25%] Building CXX object Headers/OCR/CMakeFiles/ocr.dir/ocr.cpp.o In file included from /home/user/Projects/CPP/Real/Roulette/Headers/OCR/ocr.hpp:4, from /home/user/Projects/CPP/Real/Roulette/Headers/OCR/ocr.cpp:1: /usr/local/include/opencv4/opencv2/opencv.hpp:48:10: fatal error: opencv2/opencv_modules.hpp: No such file or directory 48 | #include "opencv2/opencv_modules.hpp" | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated. make[2]: *** [Headers/OCR/CMakeFiles/ocr.dir/build.make:76: Headers/OCR/CMakeFiles/ocr.dir/ocr.cpp.o] Error 1 make[1]: *** [CMakeFiles/Makefile2:126: Headers/OCR/CMakeFiles/ocr.dir/all] Error 2 make: *** [Makefile:91: all] Error 2
main.cpp代码
#include <iostream> #include "Headers/OCR/ocr.hpp" int main() { cv::Mat image1, image2, diff_image; image1 = cv::imread("./unique_session_inactive.png"); getROI(image1, true, true); }
尝试修改的子目录CMake配置(未成功)
project(ocr) # OpenCV find_package(OpenCV REQUIRED) # X11 set(X11) link_directories(/usr/lib/X11) # Also tried using PRIVATE with no sucess target_include_directories(ocrFoo PUBLIC ${OpenCV_INCLUDE_DIRS} ${OpenCV_LIBS} /usr/include/X11 X11) target_link_libraries(ocrFoo PUBLIC ${OpenCV_LIBS} X11) add_library(${PROJECT_NAME} ocr.cpp)
问题疑问
我已在根目录CMakeLists.txt中链接OpenCV库,为何仍报错?是否需要在子目录CMakeLists.txt中配置依赖?尝试修改子目录配置后仍失败,请问遗漏了什么配置?
解答
问题根源
ocr库目标在编译时未获取到OpenCV的头文件路径。CMake中每个目标(可执行文件、库)都是独立实体,根目录给ocrFoo可执行目标添加的依赖不会自动传递给子目录的ocr库目标,必须单独为ocr配置依赖。
正确的子目录CMake配置
修改Headers/OCR/CMakeLists.txt为以下内容:
add_library(ocr ocr.cpp) # 查找OpenCV(根目录已执行过find_package,这里可省略,但保留更具独立性) find_package(OpenCV REQUIRED) # 为ocr库添加OpenCV头文件路径 target_include_directories(ocr PRIVATE ${OpenCV_INCLUDE_DIRS}) # 为ocr库链接OpenCV库(若ocr.cpp调用了OpenCV函数,此步骤必须) target_link_libraries(ocr PRIVATE ${OpenCV_LIBS})
关键说明
- 目标独立性:每个CMake目标都需要自己的
target_include_directories和target_link_libraries配置,根目录的配置仅作用于ocrFoo,不会传递给子目录的ocr库。 - 配置顺序:你之前的错误在于先操作父目录的
ocrFoo目标(子目录中无法直接操作父目录目标,除非用PARENT_SCOPE,但这不是正确做法),必须先定义ocr库目标,再为它配置依赖。 - 权限关键字选择:如果
ocr的头文件未对外暴露OpenCV类型(比如ocr.hpp中没有cv::Mat这类供上层使用的声明),用PRIVATE即可;若上层需要通过ocr.hpp使用OpenCV类型,才需要改为PUBLIC。
内容的提问来源于stack exchange,提问作者lapdoggo
相关产品推荐
相关产品推荐

