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

2024-01-03 00:04

本文主要是介绍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()

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

这篇关于CMake入门教程【核心篇】添加子目录(add_subdirectory)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/564030

相关文章

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理 秒杀系统是应对高并发、高压力下的典型业务场景,涉及到并发控制、库存管理、事务管理等多个关键技术点。本文将深入剖析秒杀商品业务中常见的几个核心问题,包括 AOP 事务管理、同步锁机制、乐观锁、CAS 操作,以及用户限购策略。通过这些技术的结合,确保秒杀系统在高并发场景下的稳定性和一致性。 1. AOP 代理对象与事务管理 在秒杀商品

Weex入门教程之4,获取当前全局环境变量和配置信息(屏幕高度、宽度等)

$getConfig() 获取当前全局环境变量和配置信息。 Returns: config (object): 配置对象;bundleUrl (string): bundle 的 url;debug (boolean): 是否是调试模式;env (object): 环境对象; weexVersion (string): Weex sdk 版本;appName (string): 应用名字;

Weex入门教程之3,使用 Vue 开发 Weex 页面

环境安装 在这里简略地介绍下,详细看官方教程 Node.js 环境 Node.js官网 通常,安装了 Node.js 环境,npm 包管理工具也随之安装了。因此,直接使用 npm 来安装 weex-toolkit。 npm 是一个 JavaScript 包管理工具,它可以让开发者轻松共享和重用代码。Weex 很多依赖来自社区,同样,Weex 也将很多工具发布到社区方便开发者使用。

Weex入门教程之2,Android Studio安装Weex插件

插件位置及描述 https://plugins.jetbrains.com/idea/plugin/8460-weex 貌似对windows还不是很支持,先放着吧。 安装 插件功能 先预览下都有什么功能 安装完成Weex插件后,如果在main toolbar找不到这些功能图标,那么就需要手动添加到main toolbar 添加到main toolbar 红框内就是

Weex入门教程之1,了解Weex

【资料合集】Weex Conf回顾集锦:讲义PDF+活动视频! PDF分享:链接:http://pan.baidu.com/s/1hr8RniG 密码:fa3j 官方教程:https://weex-project.io/cn/v-0.10/guide/index.html 用意 主要是介绍Weex,并未涉及开发方面,好让我们开始开发之前充分地了解Weex到底是个什么。 以下描述主要摘取于

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

Cmake之3.0版本重要特性及用法实例(十三)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧