CMake的简单使用

一、一个最简单的CMake项目

在Ubuntu上使用CMake构建一个最简单的项目。

1. 安装CMake

首先安装CMake,这里使用的是Ubuntu系统。

sudo apt-get install cmake

2. 编写源程序

编写代码,新建文件main.c。

// main.c
#include "stdio.h"int main(void)
{printf("Hello World!\r\n");return 0;
}

3. 编写CMake文件

在同一个目录下编写CMake文件,名字必须CMakeLists.txt

cmake_minimum_required (VERSION 2.8)project(demo)add_executable(hello main.c)

project关键字指定了工程的名字。
add_executable关键字用来生成可执行文件。其中,hello用来指定生成的可执行文件的文件名,main.c指定编译的源文件。

4. 编译

编写完成后,在CMake当前目录下执行

cmake .


但是这样会在当前目录下生成很多中间文件,很难清理。

可以使用下面的指令,让所有中间文件都生成到build目录下。

cmake . -B build

清理中间文件的时候直接rm -rf build即可。
build目录下会有一个生成的Makefile文件,在该目录下make进行编译。

也可以在源代码的目录下面的cmake指令代替make指令进行编译。

cmake --build build


build目录下生成可执行文件hello,直接./hello执行。

二、CMake语法

file(GLOB …)

file (GLOB ...)命令用于获取指定模式的文件列表,一种常见的用法是用来收集指定格式的源文件列表,基本语法为

file(GLOB variable [LIST_DIRECTORIES true|false] [RELATIVE path] [CONFIGURE_DEPENDS] [globbingexpressions]...)

但存在一些问题:

  1. 不会自动检测新增或删除的文件: 使用file(GLOB ...)时,CMake 不会自动检测源文件的变化,因此在添加或删除源文件时,需要手动重新运行 CMake。

  2. 不建议在大型项目中使用: 对于大型项目,由于可能包含大量的源文件,使用file(GLOB ...)可能会导致性能问题。
    在大型项目中,推荐使用显式地列出所有源文件的方式,例如

set(SOURCESsrc/file1.cppsrc/file2.cppsrc/file3.cpp# ...src/main.cpp
)add_executable(my_executable ${SOURCES})

include_directories

include_directories用来在构建中添加包含的目录。其格式为

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

例如,如果main.c文件想直接引入另一个路径下的头文件,则将头文件a.h,则将a.h的相对路径放在include_directories列表中,main.c中直接#include "a.h"即可,而不需写成#include “/path/to/a.h”

举例

目录结构构建如下

├── CMakeLists.txt		#最外层的CMakeList.txt
├── source				#源文件目录
│     └── main.c		#源文件
└── include				#子目录└── a.h			#头文件

CMakeLists.txt

cmake_minimum_required (VERSION 2.8)project (demo)file (GLOB srcfiles source/*.c) # 将所有source目录下的.c文件加入名为srcfiles的文件列表
include_directories(./include/) # 将所有include目录下的文件加入构建add_executable(hello ${srcfiles})

main.c

#include "stdio.h"
#include "a.h" // 直接引用a.h,不需要加相对路径int main(void)
{printf("%d\n", TEST_MARCO);return 0;
}

a.h

#ifndef __A_H__
#define __A_H__
#define TEST_MARCO 10
#endif /* __A_H__ */

构建并运行项目

cmake . -B build
cmake --build build
./build/hello

得到的输出:10

参考文章:
【CMake】简单学习
CMake使用file(GLOB …)需要注意的问题
CMake中include_directories的使用

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

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

相关文章

Spring Boot应用集成Actuator组件以后怎么自定义端点暴露信息

一、 前言 在平时业务开发中,我们往往会在spring Boot项目中集成Actuator组件进行系统监控,虽然Actuator组件暴露的端点信息已经足够丰富了,但是特殊场景下,我们也需要自己暴露端点信息,此时应该怎么操作呢&#xff1…

智能运维乱象有哪些?智能运维业务包括哪些

在实施智能运维过程中可能遇到的乱象及其原因,系统地阐述智能运维业务所涵盖的各个方面,包括但不限于预防性维护、故障检测与诊断、自动化修复以及持续的性能优化等关键组成部分。 实施智能运维过程中可能遇到的乱象及原因包括: 数据不一致或…

qt-交通路口仿真

qt-交通路口仿真 一、演示效果二、核心代码三、程序链接 一、演示效果 二、核心代码 #include "generator.h"Generator::Generator(SimulationScene *scene):m_scene(scene),m_mode(VEHICLEMETHOD::GO_THROUGH),m_running_state(false),m_VisionOn(false),m_IsInter…

※【回溯】【深度优先前序】Leetcode 257. 二叉树的所有路径

※【回溯】【深度优先前序】Leetcode 257. 二叉树的所有路径 解法0 迭代法解法1 深度优先 前序解法2 深度优先 前序 添加了StringBulider ---------------🎈🎈257. 二叉树的所有路径 题目链接🎈🎈------------------- 解法0 迭代法…

SpringAop是什么?

简单介绍: AOP:Aspect Oriented Programming (面向切面编程、面向方面编程),其实就是面向特定方法编程。 场景: 比如现在有一个需求,我要统计每一个业务方法的耗时时长, 我们只需在业务方法的前面获取一个…

算法通关村-----继续看回溯问题

复原IP地址 问题描述 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。 例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.…

MAC端Terminus 绿色版下载【一键安装,即可使用】

Termius Mac 是一款非常好用而且漂亮的SSH客户端,能快速远程控制服务器 现在呢,很多小伙伴,都开始使用这个软件啦 但是对于mac系统来说: 这个软件不要在苹果app store下载,不能实现传输功能这个软件目前有7天适用期&a…

MybatisPlus多表联查-分页关联查询+根据id获取多表联查后的单行数据

分页关联查询 需求分析 有两张表w以及d,需要w的一些字段以及d的一些字段在前端显示 此时就需要用到关联查询,查询到的数据放入视图类,显示在前端 项目结构 视图类 package com.wedu.modules.tain.entity.vo;import lombok.Data;import ja…

SpringBoot常见问题

1 引言 Spring Boot是一个基于Spring框架的快速开发脚手架,它简化了Spring应用的初始化和搭建过程,提供了众多便利的功能和特性,比如自动配置、嵌入式Tomcat等,让开发人员可以更加专注于业务逻辑的实现。   Spring Boot还提供了…

Linux:Jenkins:GitLab+Maven+Jenkins的部署(1)

1.环境 我这里准备了三台centos7 1.用于部署gitlab 运行内存:6G 名字:Jenkins-GitLab 192.168.6.1 2.用于部署jenkins 运行内存:2G 名字:Jenkins-server 192.168.6.2 3.用于打包测试…

你真的懂串口通信吗?

一、什么是串口通讯? 串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式。尽管串行通讯的比按字节传输的并行通信慢,但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。 典型的串口通信使用3根线完成,分…

网络安全--网鼎杯2018漏洞复现(二次注入)

一、环境:在线测试平台 BUUCTF在线评测 (buuoj.cn) 二、进入界面先尝试万能账号 1or11# 换格式 hais1bux1 11or11# 三、万能的不行那我们就得想注册了,去register.php去看看 注册个账号 发现用户名回显,猜测考点为用户名处二次注入&…