当前位置: 首页 > news >正文

CMake入门教程【核心篇】添加子目录(add_subdirectory)

文章目录

  • 1.概述
  • 2.添加子目录
  • 3.指定二进制目录
  • 4.排除子目录
  • 5.使用别名
  • 6.传递变量
  • 7.检查子目录是否存在

1.概述

add_subdirectory是 CMake 中的一个命令,用于向当前项目添加一个子目录。它的语法如下:

add_subdirectory
添加子目录
指定二进制目录
排除子目录
使用别名
传递变量
检查子目录是否存在
将子项目目录添加到构建中
为子项目指定不同的构建输出目录
在特定条件下排除子目录
为子项目或库创建别名
向子目录传递CMake变量
在添加子目录前验证其存在
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

其中:

  • source_dir 是要添加的子目录的路径。
  • binary_dir 是可选的二进制目录路径,用于指定子目录的构建输出目录。如果未指定,将使用默认的构建输出目录。
  • EXCLUDE_FROM_ALL 是可选的参数,用于指定是否将子目录排除在构建过程之外。如果指定了该参数,子目录将不会在构建时被构建。

使用 add_subdirectory 命令后,CMake 会在指定的 source_dir 中查找 CMakeLists.txt 文件,并执行该文件中的命令。这样,您可以将子目录作为独立的项目进行构建,并与主项目进行协作。

通常,在子目录的 CMakeLists.txt 文件中,您可以定义和配置子目录的构建过程、生成库或可执行文件,并使用 target_link_libraries 命令将子目录的目标与主项目的目标进行链接。

2.添加子目录

假设您的项目结构如下:

project/
├── CMakeLists.txt
├── main.cpp
└── subdirectory/├── CMakeLists.txt├── lib/│   ├── CMakeLists.txt│   ├── lib.cpp│   └── lib.h└── tests/├── CMakeLists.txt└── test.cpp

在主项目的 CMakeLists.txt 文件中,您可以使用 add_subdirectory 命令将子目录添加到主项目中:

cmake_minimum_required(VERSION 3.12)
project(MyProject)# 主项目的构建配置# 添加子目录
add_subdirectory(subdirectory)# 主项目的目标和链接等配置

在子目录的 CMakeLists.txt 文件中,您可以定义子目录的构建过程和目标:

# 子目录的 CMakeLists.txt# 子目录的构建配置# 生成库或可执行文件
add_library(mylib lib/lib.cpp lib/lib.h)# 子目录的目标和链接等配置

通过 add_subdirectory 命令,子目录中的 CMakeLists.txt 文件将被执行,子目录的构建过程和目标将与主项目一起构建和链接。

请注意,add_subdirectory 命令应该在主项目的 CMakeLists.txt 文件中使用,并且应该在主项目的目标和链接配置之前。这样可以确保子目录的目标在主项目的构建过程中可用。

3.指定二进制目录

可以通过在 add_subdirectory 命令中提供可选的 binary_dir 参数来指定子目录的二进制目录。这样可以将子目录的构建输出与主项目的构建输出分开,使项目结构更清晰。例如:

add_subdirectory(subdirectory bin)

这将在主项目的构建目录下创建一个名为 bin 的子目录,用于存放子目录的构建输出。

4.排除子目录

如果您希望在构建主项目时排除某个子目录,可以使用 EXCLUDE_FROM_ALL 参数。这在某些情况下很有用,比如只构建主项目的特定部分或避免构建测试目录。例如:

add_subdirectory(tests EXCLUDE_FROM_ALL)

这将排除名为 tests 的子目录,使其不会在构建主项目时被构建。

5.使用别名

在主项目中,您可以为子目录的目标创建一个别名,以便在主项目中更方便地引用子目录的目标。这在链接库或设置依赖关系时很有用。例如:

add_subdirectory(subdirectory)
add_executable(myapp main.cpp)
target_link_libraries(myapp PRIVATE subdirectory::mylib)

这里,subdirectory::mylib 是对子目录中名为 mylib 的目标的别名,可以直接在主项目中使用。

6.传递变量

使用 add_subdirectory 命令可以将变量传递给子目录的 CMakeLists.txt 文件。您可以在主项目的 CMakeLists.txt 文件中定义变量,并在子目录的 CMakeLists.txt 文件中使用。例如:

set(MY_VARIABLE "Hello, World!")
add_subdirectory(subdirectory)

在子目录的 CMakeLists.txt 文件中,可以访问和使用 MY_VARIABLE 变量。

7.检查子目录是否存在

在使用 add_subdirectory 命令之前,可以使用 if(EXISTS ...) 检查子目录是否存在。这可以避免在子目录不存在时引发错误。例如:

if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/subdirectory")add_subdirectory(subdirectory)
else()message(FATAL_ERROR "Subdirectory 'subdirectory' does not exist.")
endif()

这将在子目录存在时添加子目录,否则会发出错误消息并停止构建。

http://www.lryc.cn/news/271837.html

相关文章:

  • Prototype原型模式(对象创建)
  • [Redis实战]分布式锁
  • SpingBoot的项目实战--模拟电商【2.登录】
  • http——https实现指南
  • ROS仿真R2机器人之安装运行及MoveIt的介绍
  • 【linux 多线程并发】线程属性设置与查看,绑定CPU,线程分离与可连接,避够多线程下的内存泄漏
  • 70.乐理基础-打拍子-三连音
  • 100天精通Python(实用脚本篇)——第111天:批量将PDF转Word文档(附上脚本代码)
  • 如何在 NAS 上安装 ONLYOFFICE 文档?
  • Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的图像剪切(ROI)功能(C++)
  • 从 WasmEdge 运行环境读写 Rust Wasm 应用的时序数据
  • 算法训练营Day34(贪心算法)
  • uniapp:全局消息是推送,实现app在线更新,WebSocket,apk上传
  • ARM1.2作业
  • 【算法专题】递归算法
  • 不停止业务的情况下优化 Elasticsearch Reindex
  • PB 按Excel动态创建对应字段
  • 数据结构——红黑树 and B-树
  • Android中线程间的通信-Handler
  • Spring Boot Admin健康检查引起的Spring Boot服务假死
  • java企业人事信息管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • 如何通过 useMemo 和 useCallback 提升你的 React 应用性能
  • ArkTS - @Prop、@Link
  • Python中matplotlib库的使用1
  • 位乘积计数-蓝桥
  • HCIA-Datacom题库(自己整理分类的)——OSPF协议判断
  • 【FPGA/verilog -入门学习16】fpga状态机实现
  • 记chrome的hackbar无法post php://input的问题
  • 相机解析驱动小记
  • EasyExcel判断导入时是否符合给定模板