关于CMake多级目录/多个子目录/子目录文件调用另外子目录文件接口及清除CMake生成的中间文件的注意事项

1)如果子目录代码文件相对独立,也就是没有引用其他子目录的文件,可以单独编译成库文件

上层CMakeLists.txt通过link_libraries()来添加这个库文件

2)如果子目录代码引用了其他子目录的文件,建议在上一层编译(前提也是相对独立)

上层CMakeLists.txt通过aux_source_directory()来添加子目录文件

举个例子,假设有个src目录下的代码结构如下

src
├── CMakeLists.txt
├── main.c
├── utils
│    ├── utils.h
│    └── utils.c
└── log├── CMakeLists.txt├── log.h└── log.c

其中,log模块相对独立,而utils模块调用了log模块。

log.h(在log目录)

#pragma oncevoid log1( const char* text );

log.c(在log目录)

#include "log.h"
#include <stdio.h>void log1( const char* text ){printf("[DEBUG] %s\n",text);
}

log目录下的CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(log)#搜索当前目录下所有源文件
aux_source_directory(./ SRC)#编译静态库文件
add_library(log ${SRC})

utils.h(在utils目录)

#pragma oncevoid doSomething();

utils.c(在utils目录)

#include "utils.h"
#include "log.h"void doSomething(){log1("--doSomething--");
}

utils目录下没有CMakeLists.txt

src目录(log和utils目录的上一级目录)下的main.c

#include "utils.h"
#include "log.h"
int main(int argc, char** argv ){log1("--main--");doSomething();return 0;
}

src目录的CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(test)#添加头文件搜索路径
include_directories(${PROJECT_SOURCE_DIR}/log)
include_directories(${PROJECT_SOURCE_DIR}/utils)#添加和构建子目录,会执行子目录的CMakeLists.txt
add_subdirectory(log)#连接静态库
link_libraries(log)#搜索utils子目录源代码文件(名), 记在UTILS_SRC变量
aux_source_directory(${PROJECT_SOURCE_DIR}/utils UTILS_SRC)#生成可执行文件
add_executable(demo main.c ${UTILS_SRC})

注意到,对log模块的处理方式是

#添加和构建子目录,会执行子目录的CMakeLists.txt
add_subdirectory(log)

#连接静态库
link_libraries(log)

对utils模块的处理方式是

#搜索utils子目录源代码文件(名), 记在UTILS_SRC变量
aux_source_directory(${PROJECT_SOURCE_DIR}/utils UTILS_SRC)

#生成可执行文件
add_executable(demo main.c ${UTILS_SRC})

也就是通过UTILS_SRC来记录utils的所有源文件名,通过${UTILS_SRC}来引用。

然后,构建工程&编译

cd src
cmake . -B build
cmake --build build

cmake . -B build 作用是 构建工程并且把中间文件保存在build目录,子目录的中间文件也会存到里面
cmake --build build 作用是在build目录编译&链接生成目标文件(此处是demo)

最后,可以在build目录下看到demo这个程序。

如果要删除 build目录,这条命令:rm -rf build (也就是普通删除文件夹命令)

末了,切记,要根据实际情况来配置CMakeLists.txt,不要生搬硬套别人的做法,此文只是抛砖引玉。

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

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

相关文章

睿趣科技:抖音开店前期需要准备什么

抖音作为全球最受欢迎的短视频平台之一&#xff0c;已经成为了许多年轻人的创业和赚钱的机会。如果你计划在抖音上开店&#xff0c;那么在正式开业之前&#xff0c;有一些重要的准备工作是必不可少的。下面就是抖音开店前期需要准备的关键步骤和注意事项。 确定你的目标和产品&…

Matlab图像处理-三原色

三原色 根据详细的实验结果&#xff0c;人眼中负责颜色感知的细胞中约有65%对红光敏感&#xff0c;33%对绿光敏感&#xff0c;只有2%对蓝光敏感。正是人眼的这些吸收特性决定了所看到的彩色是一般所谓的原色红&#xff08;R&#xff09;、绿&#xff08;G&#xff09;和蓝&…

动态渲染 echarts 饼图(vue 2 + axios + Springboot)

目录 前言1. 项目搭建1.1. 前端1.2. 后端 2. 后端数据渲染前端2.1 补充1&#xff1a;在 vue 中使用 axios2.2. 补充2&#xff1a;Springboot 处理跨域问题2.3. 修改前端代码2.3.1 修改饼图样式2.3.2 调用后台数据渲染饼图2.3.3 改造成内外两个圈 前言 因为上文中提到的需求就是…

内网隧道代理技术(二十五)之 ICMP隧道反弹SHELL

ICMP隧道反弹SHELL ICMP隧道原理 由于ICMP报文自身可以携带数据,而且ICMP报文是由系统内核处理的,不占用任何端口,因此具有很高的隐蔽性。把数据隐藏在ICMP数据包包头的data字段中,建立隐蔽通道,可以实现绕过防火墙和入侵检测系统的阻拦。 ICMP隧道有以下的优点: ICMP…

腾讯云4核8G服务器选CVM还是轻量比较好?价格对比

腾讯云4核8G云服务器可以选择轻量应用服务器或CVM云服务器标准型S5实例&#xff0c;轻量4核8G12M服务器446元一年&#xff0c;CVM S5云服务器935元一年&#xff0c;相对于云服务器CVM&#xff0c;轻量应用服务器性价比更高&#xff0c;轻量服务器CPU和CVM有区别吗&#xff1f;性…

博客系统(升级(Spring))(四)(完)基本功能(阅读,修改,添加,删除文章)(附带项目)

博客系统 (三&#xff09; 博客系统博客主页前端后端个人博客前端后端显示个人文章删除文章 修改文章前端后端提取文章修改文章 显示正文内容前端后端文章阅读量功能 添加文章前端后端 如何使用Redis项目地点&#xff1a; 博客系统 博客系统是干什么的&#xff1f; CSDN就是一…

数字化转型对企业有哪些优势?

数字化转型为企业提供了众多优势&#xff0c;帮助他们在日益数字化的世界中保持竞争力、敏捷性和响应能力。以下是一些主要优势&#xff1a; 1.提高效率和生产力&#xff1a; 重复性任务和流程的自动化可以减少人为错误&#xff0c;并使员工能够专注于更具战略性的任务。简化…

Apache Linki 1.3.1+DataSphereStudio+正常启动+微服务+端口号

我使用的是一键部署容器化版本&#xff0c;官方文章 默认会启动6个 Linkis 微服务&#xff0c;其中下图linkis-cg-engineconn服务为运行任务才会启动,一共七个 LINKIS-CG-ENGINECONN:38681 LINKIS-CG-ENGINECONNMANAGER:9102 引擎管理服务 LINKIS-CG-ENTRANCE:9104 计算治理入…

Vue开发小注意点

改bug 更改了配置项啥的&#xff0c;保存刷新发现没变&#xff0c;那就重启项目&#xff01;&#xff01;&#xff01;&#xff01; binding.value 和 e.target.value binding.value Day5 指令的值 e.target.value Day4 表单组件封装 binding.value 和 e.target.valu…

plt函数显示图片 在图片上画边界框 边界框坐标转换

一.读取图片并显示图片 %matplotlib inline import torch from d2l import torch as d2l读取图片 image_path ../data/images/cat_dog_new.jpg # 创建画板 figure d2l.set_figsize() image d2l.plt.imread(image_path) d2l.plt.imshow(image);二.给出一个(x左上角,y左上角,…

Flask 使用 JWT(三)flask-jwt-extended

如果想要在 flask 中使用 JWT ,推荐使用 flask-jwt-extended 插件。 使用 pip 安装这个扩展插件的最简单方法是: pip install flask-jwt-extended基本使用 在接下来的案例中,我们看一下基本使用。我们可以使用 create_access_token() 函数用来生成实际的 JWT token。@jwt_r…

K8S之使用yaml格式定义pod

mysql-pod.yaml # overView: # 1. web服务与db打包放在同一个pod中&#xff0c;本地通过localhost来访问&#xff0c;并附带存活性/可用性检测 # 2. 补充重启策略/镜像拉去策略 # 3. 对容器资源进行限制apiVersion: apps/v1 kind: Pod metadata:name: pub-oanamespace: hunte…

__declspec(novtable) 在C++

__declspec(novtable) 在C中接口中广泛应用. 不容易看到它是因为在很多地方它都被定义成为了宏. 比如说ATL活动模板库中的ATL_NO_VTABLE, 其实就是__declspec(novtable). __declspec(novtable) 就是让类不要有虚函数表以及对虚函数表的初始化代码, 这样可以节省运行时间和空间.…

服务注册与服务发现

服务注册与服务发现 Eureka的架构 Eureka客户端&#xff1a;使用了EnableEurekaClient注解的应用服务&#xff0c;如订单服务等&#xff0c;甚至Eureka本身也是一个客户端 Eureka服务端&#xff1a;使用了EnableEurekaServer注解的应用服务&#xff0c;该服务提供了注册表以及…

使用Git把项目上传到Gitee的详细步骤

1.到Git官网下载并安装 2.到Gitee官网进行注册&#xff0c;然后在Gitee中新建一个远程仓库 3.设置远程仓库的参数 4.返回Gitee查看仓库是否生成成功 5.新建一个文件夹作为你的本地仓库 6.将新建好的文件夹初始化成本地仓库 第一步&#xff1a;右键点击刚创建的本地仓库&#…

小程序实现一个 倒计时组件

小程序实现一个 倒计时组件 需求背景 要做一个倒计时&#xff0c;可能是天级别&#xff0c;也可能是日级别&#xff0c;时级别&#xff0c;而且每个有效订单都要用&#xff0c;就做成组件了 效果图 需求分析 需要一个未来的时间戳&#xff0c;或者在服务度直接下发一个未来…

NeuroFlash:AI文章写作与生成工具

【产品介绍 ​ 】 名称 NeuroFlash 上线时间 2015 具体描述 Neuroflash是一款基于人工智能的文本和图像生成器&#xff0c;可以帮助用户快速创建高质量的内容。Neuroflash拥有超过100种短文和长文的文本类型&#xff0c;涵盖了各种营销场景和需求。只需要输入简单的指示&#…

【Excel函数】Trim函数删除前后多余的空格

Excel 中的 TRIM 函数用于删除文本字符串两端多余的空格&#xff0c;只保留字符串内部的空格。这对于清理和规范化文本数据非常有用。 在使用Excel中使用TRIM可以删除内容前面和后面的空格字符&#xff0c;Trim的语法规则如下&#xff1a; A2trim(Text) text&#xff1a;要进…

最新ChatGPT网站源码+支持GPT4.0+支持Midjourney绘画+支持国内全AI模型

一、智能创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&…

Debian12系统下LAMP环境中Nubuilder4.5的安装

一、环境搭建 按照官方的说法&#xff0c;Apache2和Nginx都可以的&#xff0c;实际上&#xff0c;你最好直接按照 Mariadb\Apache2\Php8.2 这个顺序&#xff0c;搭建LAMP环境较好。不然各种调试&#xff0c;还不一定能够成功。 相关搭建方法&#xff0c;属于一般操作&#xf…