cmake add_subdirectory 详解

在 CMake 中,add_subdirectory 命令用于向当前项目添加一个子目录,并且使得 CMake 在构建过程中进入该子目录继续处理其中的 CMakeLists.txt 文件。这个命令通常用于管理项目中的多个模块或子项目。
基本语法

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
  • source_dir: 指定要添加的子目录的路径。
  • binary_dir: 指定要生成的二进制文件的路径。如果未指定,将使用默认的二进制文件目录(即在构建目录下的 source_dir 子目录)。
  • EXCLUDE_FROM_ALL: 可选参数,如果设置,则将该子目录排除在 make all 或 build 目标之外。

示例

以下是几个使用 add_subdirectory 命令的示例:
1. 添加单个子目录
假设我们有如下的项目结构:

project_root/
├── CMakeLists.txt (主项目的 CMakeLists.txt)
└── sub_project/├── CMakeLists.txt (子项目的 CMakeLists.txt)└── source_code.cpp

project_root/CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(MainProject)# 添加子目录
add_subdirectory(sub_project)# 主项目的其他设置

在这个示例中,add_subdirectory 命令将 sub_project 子目录添加到主项目中。CMake 会进入 sub_project 目录并继续处理其下的 CMakeLists.txt 文件。

2. 添加多个子目录
可以在主项目的 CMakeLists.txt 文件中多次使用 add_subdirectory 命令来添加多个子目录。
project_root/CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(MainProject)# 添加多个子目录
add_subdirectory(module1)
add_subdirectory(module2)
add_subdirectory(module3)

3. 使用 binary_dir 参数指定二进制目录

cmake_minimum_required(VERSION 3.10)
project(MainProject)# 添加子目录,并指定二进制目录
add_subdirectory(libs/maths /maths_build)# 在主项目中使用该库
add_executable(my_program main.cpp)
target_link_libraries(my_program maths)

在这个示例中,我们将 libs/maths 目录添加为子目录,并指定了二进制目录为 /maths_build。这样可以将编译产生的中间文件和库文件分开存放,保持项目结构清晰。

注意事项

  • 子目录的作用域: add_subdirectory 命令会在当前的 CMake 执行上下文中添加子目录。子目录中的变量、函数等定义将会影响到当前的 CMake 运行环境。
  • 二进制目录的使用: 指定 binary_dir 参数可以帮助在构建过程中保持清晰的输出目录结构,特别是在管理多个子项目或模块时尤为有用。
  • 排除子目录: 使用 EXCLUDE_FROM_ALL 参数可以在生成项目时排除指定的子目录,这在某些情况下可以避免不必要的构建。

结论
add_subdirectory 命令是 CMake 中管理项目结构的重要工具,允许将项目划分为多个模块或子项目,并进行统一的构建管理。通过合理使用 add_subdirectory 命令,可以使得 CMake 项目的结构更加清晰和可维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/861501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RK3568平台(音频篇)RT5651解码芯片Codec驱动分析

一.Audio Codec的必要性 在理想状况下,对于录音过程,只需要将麦克风获取到的analog信号通过ADC转换为digital信号并存储即可,对于播放音过程,只需要将digital信号通过DAC转换为analog并输出到speaker播放即可。 但在实际的过程中…

ES6新特性 面试高频题1

var、let 和 const 的区别 作用域 var是函数作用域,如果在一个代码块(如 if 语句或 for 循环)中声明,它仍然可以在整个函数内访问。 let const是块级作用域, 这意味着它们只在声明它们的代码块内可见。可变性 var 和 …

【学习】如何利用Python技术进行软件测试相关工作

Python是一种广泛使用的高级编程语言,它因其简洁的语法、强大的库支持和跨平台特性而受到开发者的喜爱。在软件测试领域,Python同样发挥着重要作用,它可以帮助测试人员编写自动化测试脚本、进行接口测试、性能测试、以及处理测试数据等。以下…

Camera定制修改

需求: Android13 MtkCamera右上角的前后摄切换点击范围小导致经常点击无反应,需增大view宽度 跟踪代码可找到对应资源文件:vendor\mediatek\proprietary\packages\apps\Camera2\feature\setting\cameraswitcher\res\ 根据vendor\mediatek\…

【Linux】进程信号_3

文章目录 八、进程信号2. 信号的保存3. 信号的处理 未完待续 八、进程信号 2. 信号的保存 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到…

华为开发者调试工具使用介绍(MDC)

MDC的开发过程的三大工具:MMC、MDS、Mind Studio,这三个工具完成了开发过程中的配置文件编写、代码编写以及AI模型的开发三个任务。除了开发,MDC还准备了两个调试工具,用于使用过程中数据的查看等。这一些调试工具分别对映射MDC中…

单目标应用:基于鳗鱼和石斑鱼优化器(Eel and grouper optimizer,EGO)的微电网优化(MATLAB代码)

一、微电网模型介绍 微电网多目标优化调度模型简介_vmgpqv-CSDN博客 参考文献: [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、鳗鱼和石斑鱼优化器求解微电网 2.1算法简介 鳗鱼和石斑鱼优化器&…

过滤器模式

过滤器模式 过滤器模式(Filter Pattern)是一种设计模式,它允许你使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式将这些标准组合起来。这种模式特别适用于希望对数据集进行灵活过滤的场景,而不需要修改现有代…

GPT-5:AI新纪元的开启与我们的未来

GPT-5 一年半后发布?对此你有何期待? IT之家6月22日消息,在美国达特茅斯工程学院周四公布的采访中,OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布,给出了肯定答案并表示将在一年半后发布。此外,…

前端面试题(基础篇十)

一、JavaScript内置类型 JS 中分为七种内置类型,七种内置类型⼜分为两⼤类型:基本类型和对象 ( Object )。 基本类型有六种: null , undefined , boolea n, number , …

MySQL简介:开源数据库的基石(一)

目录 引言:数据库领域的革新者 一、MySQL的发展历程:从开源先锋到行业领袖 二、MySQL的核心特性:性能、安全与灵活性并重 三、MySQL的应用场景:从Web开发到企业级应用的全面覆盖 四、MySQL在开源数据库中的地位:开…

梳理湖南省各市市场监督管理专项资金申请条件对象及认定补贴流程

第一章 总 则 第一条 为加强和规范湖南省市场监督管理专项资金管理,提高资金使用效益,根据《中华人民共和国预算法》《中共中央 国务院关于全面实施预算绩效管理的意见》《湖南省人民政府关于进一步深化预算管理制度改革的实施意见》(湘政发〔2021〕14号…

Excel直接打开csv文件后,数据不能正常显示的解决方法

很多处理公司数据的同事偶尔也会遇到使用Microsoft的Excel或者金山的WPS打开csv文件后,发现数据不能正常显示,其实csv属于一种数据库文件,遵循数据库存储的规则,建议使用导入的方式进行打开。 1.打开一张空白的Excel表&#xff0…

Spring Boot 集成 H2 数据库

1. 引言 Spring Boot 以其简洁的配置和快速开发能力,成为现代微服务架构的首选框架之一。而H2数据库作为一个轻量级的内存数据库,非常适合开发阶段作为嵌入式数据库进行单元测试和功能验证。本文将手把手教你如何在Spring Boot项目中集成H2数据库&#…

Open3D 显示带有强度的点云数据

目录 一、概述 1.1强度信息的意义 1.2应用场景 二、代码实现 三、实现效果 一、概述 在点云数据中,强度(Intensity)指的是激光雷达传感器在扫描环境时,每个点返回的反射强度值。这些强度值代表了激光脉冲返回的能量&#xff…

Python + Playwright(19):Clock 测试时间相关行为API

Python + Playwright(19):Clock 测试时间相关行为API 概述Clock API 的重要性Clock API 的详细说明初始化时钟并设置特定时间暂停时钟快进时钟代码示例高级用法模拟网络延迟测试异步操作实践建议测试前清理环境分离时间相关和非时间相关的测试使用明确的断言注意事项恢复时钟…

centos 破解密码

重启您的CentOS系统。 在GRUB引导加载器启动过程中,当看到启动画面时,按下e键进入编辑模式。 找到以 linux16 或 linux 开头的启动行。 在该行的末尾添加 rd.break 或者ro(只读)修改为 rw 加init/sysroot/bin/sh参数&#xff0…

IPQ5018 SPF12.2 CSU3 编译指南

编译和加载image 1. 从高通的门户网站下载高通技术公司(QTI)专有的CHIPCODE 2. 在编译默认配置时,下载QSDK的相关组件 3. 生成固件: a. 重新组装代码,生成QSDK 框架 b. 设置并创建QSDK c. 生成一个完整的固件镜像 4. flash 烧写软件映像 安装编译环…

torchaudio.load() 和 librosa.load() 的返回值区别

问题 之前都在使用librosa加载音频数据,今天看到一段代码是用torchaudio加载的音频,发现torchaudio加载的数据和librosa返回的结果不一致。 查看资料后做出以下对比: torchaudio.load 函数返回一个包含两个张量的元组: 音频数据张量,形状为…

Nacos详解

nacos官方文档:https://nacos.io/ 一、什么是nacos? Nacos是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 nacos官方文档:https://nacos.io/ nac…