CMake之嵌套的CMakeLists

文章目录

  • 前言
    • 项目结构
    • 节点关系
    • 如何嵌套多个cmake
    • 示例程序cmake
  • 总结


前言

在现代软件开发中,CMake 是一个非常重要的工具,它允许开发者编写可移植的构建脚本来管理项目。对于大型项目,通常会有多个模块或子项目,这时候就需要用到嵌套的 CMakeLists 文件来组织代码。本文将简要介绍如何使用嵌套的 CMakeLists 来管理复杂的项目结构。


项目结构

.
├── build
│   ├── cJSON
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── cmake_install.cmake
│   ├── log
│   ├── Makefile
│   └── test1
├── cJSON
│   ├── cJSON.c
│   └── CMakeLists.txt
├── CMakeLists.txt
├── include
│   ├── cJSON.h
│   └── log.h
├── log
│   ├── CMakeLists.txt
│   └── log.c
└── test1├── CMakeLists.txt└── main.c9 directories, 12 files

节点关系

众所周知,Linux的目录是树状结构,所以嵌套的 CMake 也是一个树状结构,最顶层的 CMakeLists.txt 是根节点,其次都是子节点。因此,我们需要了解一些关于 CMakeLists.txt 文件变量作用域的一些信息:

根节点CMakeLists.txt中的变量全局有效
父节点CMakeLists.txt中的变量可以在子节点中使用
子节点CMakeLists.txt中的变量只能在当前节点中使用

这三个概念是CMake中变量作用域的基本规则,可以这样理解:

  • 根节点变量: 在最顶层的CMakeLists.txt文件中定义的变量,它们在整个项目中都是可见的。这意味着无论在项目的哪个位置,这些变量都可以被访问和使用。

  • 父节点变量: 在某个目录的CMakeLists.txt文件中定义的变量,它们可以被该目录下的子目录(即子节点)中的CMakeLists.txt文件使用。父节点变量对子节点来说是可见的,但不会影响到其他平行的目录。

  • 子节点变量: 在子目录的CMakeLists.txt文件中定义的变量,它们仅在当前子目录的范围内有效。这些变量对父目录或其他目录中的CMakeLists.txt文件是不可见的。

如何区分父子节点:
父节点:如果一个目录包含其他的子目录,并且这个目录下有一个CMakeLists.txt文件,那么我们就称这个目录为"父节点"。父节点中定义的变量可以在其所有子节点中使用。

子节点:如果一个目录位于另一个目录下,并且这个目录下也有一个CMakeLists.txt文件,那么我们就称这个目录为"子节点"。子节点可以使用其父节点中定义的变量,但是子节点中定义的变量只能在当前子节点中使用,对父节点或其他子节点不可见。

如何嵌套多个cmake

我们可以在每个小目录下的CMakeLists.txt里面去生成动态/静态库,然后在你含main.c里面的CMakeLists.txt去链接他们,这样就能实现对应的效果了。
那么,为什么不使用把源文件干过来呢?
这样就失去了意义啊,CMakeLists.txt就毫无作用了

在根目录中,我们可以使用add_subdirectory()这个去添加子目录

示例程序cmake

根节点:
一般,我们在根节点可以直接把头文件加入进去,就不用子节点去添加了

cmake_minimum_required(VERSION 3.2)
project(MyProject)# 添加头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)# 添加子目录
add_subdirectory(cJSON)
add_subdirectory(log)
add_subdirectory(test1)

log目录:

aux_source_directory(. DIR_LIB_SRCS)
add_library(log ${DIR_LIB_SRCS})

cJSON目录:

aux_source_directory(. DIR_LIB_SRCS)
add_library(cJSON ${DIR_LIB_SRCS})

main目录:

aux_source_directory(. DIR_SRCS)
add_executable(test1 ${DIR_SRCS})# 链接库文件
target_link_libraries(test1 cJSON log)

总结

通过使用嵌套的 CMakeLists 文件,我们可以有效地管理大型项目中的多个子模块。这种方法提供了清晰的模块划分,便于维护和扩展。虽然初学者可能会觉得有些复杂,但一旦掌握了基本概念和语法,就能够利用 CMake 强大的功能来构建高效、可维护的构建系统。

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

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

相关文章

2024年618各城市跨境电商战况如何?

2024年618各城市 跨境电商战况如何? 2024 城市“618”跨境战绩(部分) 2024年“618”期间,全国跨境电商交易额实现2,397.12亿元,同比增长8.68%。从跨境商品来看,进口端,婴童食品、美容美妆、营养保健等商…

numpy.random.seed()使用

import numpy as npnp.random.seed(2) # 生成随机种子2 一次使用机会 作用在下一个随机数生成的时候 a np.random.random() # 使用随机种子2 b np.random.random() # 因为随机种子使用完了 ! 这里使用默认按系统根据时间作为seed参数的随机种子 print(a) # 随…

手机取证基础知识(一)

文章关键词:手机取证、电子数据取证 手机取证,也称为移动设备取证或智能手机取证,是数字取证的一个分支,专注于从智能手机和其他移动设备中提取、分析和呈现证据的过程。这项技术通常用于法律调查,尤其是在犯罪调查中…

关于 AI 音乐大模型的研究报告

摘要:本研究报告聚焦于近期上线的音乐大模型,探讨其对音乐创作门槛的降低影响,分析其引发的关于音乐圈是否会被 AI 彻底颠覆的讨论,以及深入研究与之相关的版权归属和创意产业在 AI 影响下的发展等问题。 一、引言 在过去的一个月…

JavaScript(1)——JS介绍

JS是什么 是一种运行在客户端(浏览器)的编程语言,实现人机交互的效果 作用(做什么) 网页特效(监听用户的一些行为让网页做出对应的反馈)表单验证(针对表单数据的合法性行为进行判…

PHP实战:轻松实现商品库存批量导入,高效管理不是梦!

在电商平台上,批量导入商品库存是一个常见的需求。通过批量导入,商家可以快速更新大量商品的库存信息,提高工作效率。本文将介绍如何使用PHP编程语言实现这一功能,方便商家进行库存管理。 首先,我们需要创建一个表格文…

[深度学习] 前馈神经网络

前馈神经网络(Feedforward Neural Network, FFNN)是人工神经网络中最基本的类型,也是许多复杂神经网络的基础。它包括一个输入层、一个或多个隐藏层和一个输出层。以下是详细介绍: 1. 结构 1. 输入层(Input Layer&am…

【Android 构建新工具】Bazel 构建Android项目

【Android 构建新工具】Bazel 构建Android项目 本文我们使用Bazel构建一个最简单的Android项目。Bazel提供了编译Android程序内置的方法,具体参考:Android Rules 1. 环境准备 Bazel只是编译工具,不是真正的编译器,所以还是需要Andorid开发的SD、NDK以及Android Studio,…

基于改进天鹰优化算法(IAO)优化支持向量机(SVM)数据分类预测(IAO-SVM)

改进天鹰优化算法(IAO)见:【智能优化算法】改进的AO算法(IAO)-CSDN博客 支持向量机(SVM)数据分类预测:基于支持向量机(SVM)的数据分类预测-CSDN博客 代码原理 基于改进天鹰优化算法(IAO)优化支持向量机(SVM&#xf…

uniapp获取证书秘钥、Android App备案获取公钥、签名MD5值

一、 uniapp获取证书秘钥 打开uniapp开发者中心下载证书打开cmd输入以下这段代码,下载提供查看到的密钥证书密码就可以了!下载证书在 java 环境下运行才可以 // your_alias 换成 证书详情中的别名,your_keystore.keystore 改成自己的证书文件…

Splashtop 的屏幕录制功能如何提高 IT 合规性

在当今的数字时代,随着远程办公的普及以及监管要求和网络安全威胁的加剧,IT 副总裁、首席信息官(CIO)等 IT 管理人员面临着一系列独特挑战。 各组织在远程支持运营中要全力维护合规性、提高安全性并坚持问责制,技术解…

汉江师范学院2024年成人高等继续教育招生简章

汉江师范学院,这所承载着深厚文化底蕴和学术积淀的高等学府,即将在2024年迎来新一季的成人高等继续教育招生。这不仅是一次知识的盛宴,更是对每一位怀揣梦想、追求进步的成年人的诚挚邀请。 汉江师范学院,以其严谨的教学态度、卓…

关于数据库的ACID几点

首先的话就是关于ACID,最重要的就是原子性了,这是基础。 原子性是指事务包含的所有操作,要么全部完成,要么全部不完成。如果不能保证原子性,可能会出现以下问题: 数据不一致:事务中的部分操作…

AI基础:从线性回归到梯度下降

一个简单的问题: 如果此时你正站在迷路缭绕的山坡上,能见度不高,但是你又想去往最低的山谷的位置,怎么走? 很简单,哪里陡那就往那里走呗——而这就是梯度下降算法的思想。 古话说:“先发制于人…

java基于ssm+jsp 电子商城系统

1管理员功能模块 管理员登录,通过填写用户名、密码进行登录,如图1所示。 图1管理员登录界面图 管理员登录进入电子商城系统可以查看个人中心、用户管理、医生管理、药品信息管理、线上诊疗管理、医生信息管理、管理员管理、论坛管理、系统管理、订单管…

行业推荐!IG5216量产工具下载,IG5216开卡软件分享

国内固态硬盘常用,且有量产工具流传出来的主控厂商包括慧荣、群联、点序、英韧、得一微、瑞昱、联芸、迈威、国科、华澜微等等。 每个主控需要用各自对应的量产工具,不同的量产工具支持的闪存颗粒也有差异,因此要根据固态硬盘实际的主控型号…

气膜建筑审批流程及现状分析—轻空间

气膜建筑作为一种新兴的建筑形式,以其快速建造、成本低廉和灵活多变的优势在各个领域得到了广泛应用。然而,气膜建筑在我国尚未被纳入正式的建筑规范,这使得其审批流程与传统建筑有显著差异。轻空间将详细探讨气膜建筑的审批流程及其在实际操…

深入探究 npm cache 命令:用途与实践指南

npm(Node Package Manager)是 JavaScript 编程语言的包管理器,广泛用于 Node.js 应用程序。它不仅用于管理项目中的依赖,还提供了一个强大的缓存机制来加速包的安装过程。npm cache 命令是与 npm 缓存交互的命令行工具&#xff0c…

MongoDB:JSON and BSON

目录 什么是 JSON MongoDB-JSON连接 什么是 BSON MongoDB 使用 BSON 还是 JSON JSON 与 BSON 架构灵活性和数据治理 JSON 和 BSON 是近亲,正如它们几乎相同的名称所暗示的那样JSON(即 JavaScript 对象表示法)是网络上广泛流行的数据交换…

grep使用

在 Windows 中,你可以使用以下步骤来使用 grep 命令: 安装 Git for Windows:grep 命令通常在类 Unix 操作系统(如 Linux、Mac OS X 等)中使用,但你可以通过安装 Git for Windows 来在 Windows 上获得类似的…