You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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})

关键说明

  1. 目标独立性:每个CMake目标都需要自己的target_include_directories和target_link_libraries配置,根目录的配置仅作用于ocrFoo,不会传递给子目录的ocr库。
  2. 配置顺序:你之前的错误在于先操作父目录的ocrFoo目标(子目录中无法直接操作父目录目标,除非用PARENT_SCOPE,但这不是正确做法),必须先定义ocr库目标,再为它配置依赖。
  3. 权限关键字选择:如果ocr的头文件未对外暴露OpenCV类型(比如ocr.hpp中没有cv::Mat这类供上层使用的声明),用PRIVATE即可;若上层需要通过ocr.hpp使用OpenCV类型,才需要改为PUBLIC。

内容的提问来源于stack exchange,提问作者lapdoggo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:20:36