【C++】cMakeLists介绍(以简单的OpenCV展示图片为例)

本文介绍了如何使用CMakeLists.txt文件结合CMake工具来编译和构建包含OpenCV的C++项目。首先,讲解了CMakeLists.txt的主要作用和基本结构,包括设置项目名称、添加源文件、指定头文件和库文件路径等关键步骤。接着,给出了一个实际的CMakeLists.txt和main.cpp代码示例,展示如何配置和链接OpenCV库。最后,演示了编译和运行项目的命令行流程。

1. CMakeLists

编写CMakeLists.txt可以调用其他的.h头文件和.so/.a库文件,通过跨平台编译工具CMake,将.cpp/.c/.cc文件编译成可执行文件或者新的库文件。

2. 相关命令行安装

brew install cmake
brew install opencv

3. 编译流程

  1. 编写CMakeLists.txt文件;
  2. 用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件;
  3. 用make命令编译源码生成可执行程序(父目录,常见.exe格式)或共享库(子目录,.a/.so(shared object))。

4. CMakeLists的基本结构

命令的官方网站:CMake Reference Documentation

最常用的命令如下(仅供后期查询,初期不需要细看):

# 本CMakeLists.txt的project名称
# 会自动创建两个变量,PROJECT_SOURCE_DIR和PROJECT_NAME
# ${PROJECT_SOURCE_DIR}:本CMakeLists.txt所在的文件夹路径
# ${PROJECT_NAME}:本CMakeLists.txt的project名称
project(xxx)

# 获取路径下所有的.cpp/.c/.cc文件,并赋值给变量中
aux_source_directory(路径 变量)

# 给文件名/路径名或其他字符串起别名,用${变量}获取变量内容
set(变量 文件名/路径/...)

# 添加编译选项
add_definitions(编
<think>首先,用户的问题是关于CMakeLists.txt的配置:如何在CMakeLists.txt中配置子文件夹项目以链接OpenCV库。用户提供了几个引用,我需要参考这些引用来构建回答。 关键点: - 用户想在CMakeLists.txt中设置子目录项目来使用和链接OpenCV库。 - 引用包括有关CMakeLists.txt的语法、添加子目录、设置变量、链接库等。 系统级指令: - 所有行内数学表达式使用$...$格式,但在这个上下文中,可能没有数学表达式,所以可能不需要。 - 独立公式使用$$...$$,但同样,这里可能不适用。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题,保证回答真实可靠。 用户可见层要求: - 回答结构清晰,逐步解决问题。 - 尽量保证真实可靠。 参考引用: - 引用[1]: 提到add_subdirectory用于包含子目录,该目录下有另一个CMakeLists.txt文件。 - 引用[2]: 展示顶层CMakeLists.txt的配置,包括设置版本、项目、编译选项、添加子目录。 - 引用[3]: 给出一个根目录CMakeLists.txt的框架,包括find_package(OpenCV)、aux_source_directory、include_directories、add_subdirectory、target_link_libraries。 - 引用[4]: 提到安卓引用OpenCV,通过implementation project(path: ':openCv'),但这是针对Android的,可能不直接相关,但可以参考。 用户的具体需求:在CMakeLists.txt中配置子文件夹项目以链接OpenCV库。这意味着用户可能有一个主项目,其中包含子目录(如src),每个子目录有自己的CMakeLists.txt,他们想在这些子项目中链接OpenCV。 步骤来配置: 1. 在顶层CMakeLists.txt中,设置项目的基本信息,包括find_package(OpenCV)来查找OpenCV库。 2. 使用add_subdirectory添加子目录,每个子目录有自己的CMakeLists.txt。 3. 在子目录的CMakeLists.txt中,定义目标(如可执行文件或库),并使用target_link_libraries链接OpenCV库。 4. 确保正确设置include_directories来包含OpenCV的头文件。 详细步骤: - 顶层CMakeLists.txt: - 设置CMake版本和项目名称。 - 使用find_package(OpenCV REQUIRED)来查找OpenCV。 - 设置include_directories来添加OpenCV的头文件。 - 添加子目录,如add_subdirectory(src)。 - 子目录CMakeLists.txt(如src/CMakeLists.txt): - 定义目标,如add_executable或add_library。 - 使用target_link_libraries链接OpenCV库,如target_link_libraries(my_target ${OpenCV_LIBS})。 从引用[3]中,有示: - 顶层:find_package(OpenCV REQUIRED),include_directories(${OpenCV_INCLUDE_DIRS}),add_subdirectory(src)。 - 然后,在顶层定义可执行文件,但用户想配置子文件夹项目,所以可能在子目录中定义目标。 在引用[3]中,顶层定义了可执行文件Armor1,并链接了OpenCV和子目录生成的库Armor。但用户想的是子目录项目链接OpenCV,所以可能子目录有自己的目标。 在引用[2]中,顶层添加了子目录,如add_subdirectory(module1),然后在module1的CMakeLists.txt中定义目标。 所以,对于用户: - 顶层CMakeLists.txt:处理全局设置,包括查找OpenCV。 - 子目录CMakeLists.txt:定义具体目标并链接OpenCV。 回答结构: 1. 介绍:简要解释CMakeLists.txt的配置方法。 2. 步骤:逐步描述如何设置。 3. 代码示:提供示代码。 4. 解释:解释关键部分。 5. 相关问题:生成相关问题。 生成相关问题: - 基于主题,生成几个相关问题,如如何优化、常见错误等。 添加引用标识: - 在回答中引用段落末尾添加[^1], [^2]等。 完整回答: - 用中文。 - 确保清晰、可靠。</think>### 如何在 CMakeLists.txt 中配置子目录项目以链接 OpenCV 库 在 CMake 项目中配置子目录项目以使用和链接 OpenCV 库,需分层设置顶层和子目录的 `CMakeLists.txt` 文件。以下是详细步骤,确保代码清晰、可维护,并遵循 CMake 最佳实践[^3][^2]。 --- #### **步骤 1: 配置顶层 CMakeLists.txt** 顶层文件负责全局设置,包括查找 OpenCV、添加子目录,并传递变量给子项目。 ```cmake # 设置最低 CMake 版本 cmake_minimum_required(VERSION 3.10) # 定义项目名称和语言(C++ 项目通常用 CXX) project(MyProject LANGUAGES CXX) # 查找 OpenCV 库(REQUIRED 表示找不到则报错) find_package(OpenCV REQUIRED) # 添加 OpenCV 头文件路径(全局生效) include_directories(${OpenCV_INCLUDE_DIRS}) # 添加子目录(如 src 文件夹) add_subdirectory(src) ``` **关键说明**: - `find_package(OpenCV REQUIRED)`:自动定位 OpenCV 的路径和库文件,变量如 `${OpenCV_LIBS}` 存储库文件列表[^3]。 - `include_directories`:将 OpenCV 头文件路径添加到编译搜索路径,所有子目录共享此设置[^3]。 - `add_subdirectory(src)`:指定子目录 `src`,该目录下必须有独立的 `CMakeLists.txt` 文件[^1][^2]。 --- #### **步骤 2: 配置子目录 CMakeLists.txt** 在子目录(如 `src/CMakeLists.txt`)中定义具体目标(可执行文件或库),并链接 OpenCV。 ```cmake # 示:子目录中定义可执行文件 # 收集当前目录所有源文件(也可手动指定如 SET(SRC_LIST main.cpp)) aux_source_directory(. DIR_SRCS) # 创建可执行文件目标 add_executable(my_app ${DIR_SRCS}) # 链接 OpenCV 库 target_link_libraries(my_app ${OpenCV_LIBS}) ``` **关键说明**: - `aux_source_directory`:自动收集源文件,简化配置(也可用 `set(SRC_LIST main.cpp)` 显式指定)[^3]。 - `target_link_libraries`:将 OpenCV 库链接到目标 `my_app`,变量 `${OpenCV_LIBS}` 由顶层 `find_package` 提供[^3][^2]。 - 若子项目是库(如静态库),使用 `add_library(my_lib STATIC ${SRC_LIST})` 并链接 OpenCV[^3]。 --- #### **完整示结构** 项目目录树: ``` MyProject/ ├── CMakeLists.txt # 顶层配置 └── src/ ├── CMakeLists.txt # 子目录配置 ├── main.cpp └── other.cpp ``` **注意事项**: 1. **变量传递**:顶层定义的变量(如 `${OpenCV_LIBS}`)自动被子目录继承,无需重复 `find_package`[^2][^3]。 2. **头文件路径**:若子目录需额外头文件(如项目自有头文件),添加 `include_directories(${PROJECT_SOURCE_DIR}/include)`[^3]。 3. **安卓特殊配置**:安卓项目中需通过 Gradle 引入 OpenCV 模块,并在 `CMakeLists.txt` 中引用路径(如 `implementation project(path: ':openCv')`)[^4]。 4. **错误排查**:确保 OpenCV 安装路径正确,CMake 能通过 `find_package` 定位。若失败,手动设置路径:`set(OpenCV_DIR "/path/to/opencv/build")`[^3]。 --- #### **常见问题解决** - **链接失败**:检查 `${OpenCV_LIBS}` 是否包含有效库文件列表,执行 `message(STATUS "OpenCV libs: ${OpenCV_LIBS}")` 调试[^3]。 - **头文件缺失**:确认 `include_directories` 包含 OpenCV 头文件路径,通常为 `${OpenCV_INCLUDE_DIRS}`[^3]。 - **子目录独立性**:每个子目录的 `CMakeLists.txt` 应独立管理其目标,顶层仅负责全局依赖[^1][^2]。 通过分层配置,项目结构更清晰,便于扩展和维护[^2][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值