Cmake工具的简单使用

引言
本篇文章讲述如何简单的使用cmake工具构建一个项目,帮助入门的c++新手学会如何使用cmake.

我们在Clion新创建一个项目时,会发现,除了main.cpp文件之外,还存在一个build-debug目录和一个CMakelists.txt文件,如图:
在这里插入图片描述
CMakelists.txt
CMakelists.txt这个文件描述的是这个项目待编译的源文件,编译选项,库依赖等信息,类似于java项目中的maven.简单来说呢,Cmakelists.txt就是一个描述你这个项目总结构的一个文件.它默认的结构是这样的:
在这里插入图片描述
cmake_minimum_required:
是指能接受的cmake工具的最低版本
project:
是指该项目的项目名
set:
指的是当前使用的C++版本,如图,目前使用C++17
add_executable:
指该项目的项目名,和所有待编译的源文件.


cmake-build-debug目录:
在Clion中默认是这个样子的:
在这里插入图片描述

那么当我们点击Clion右上角的运行按钮时,不仅终端出会输出hello,world的运行结果,在cmake-build-debug这个文件夹中也会多出一部分内容,多出的这部分内容是构建的中间文件.

构建过程
当我们在Clion中点击运行按钮的时候,Clion会帮助我们自动构建项目,但是实际的构建过程是怎样的呢?

1.首先,CMakelists.txt里记录的是这个项目的一个总结构,库依赖等信息
,我们可以使用cmake命令进行构建

cmake Path

cmake命令会根据Cmakelists.txt里面的内容,在对应的路径下生成一个makefile文件.

Makefile 文件是一个包含构建规则的文本文件,它定义了如何将源代码文件转换为可执行文件或库文件。Makefile 文件中包含了目标(target)、依赖项(dependencies)和命令(commands)。目标表示要生成的文件,依赖项表示目标所依赖的文件,而命令则是执行构建过程的具体命令。

2.通过执行 make 命令,Make 工具会读取当前目录下的 Makefile 文件,并根据其中的规则和命令来执行构建过程。Make 工具会分析文件的依赖关系,检查目标文件和依赖文件的时间戳,以确定是否需要重新编译某个文件。然后,它会按照规则中定义的命令来执行编译、汇编和链接等操作,从而生成最终的可执行文件或库文件。

make path

必须有makefile文件才能执行make命令,然后就会生成一个可执行文件,这个可执行文件,就是一个简单项目的运行结果.

Makefile 文件是非常灵活和可定制的,你可以根据项目的需要定义自己的规则和命令。通过 Make 工具和 Makefile 文件,你可以更加方便地管理和构建 C++ 项目,并确保代码在不同平台上的可移植性。

所以说构建一个项目的大致过程就是

Cmakelists.txt ------>makefile--------> project(可执行文件)
                cmake          make

我们都知道,一个纯文本的CPP文件,要变成可执行文件,是要经历四个过程的,分别是:
预处理阶段,编译阶段,汇编阶段,链接阶段
那么其实这些过程就是在make命令执行makefile文件中的命令这个阶段中执行的

但是为什么Clion中,在build目录下没生成makefile文件呢,而是生成了一堆构建的中间文件?
这是因为Clion简化了构建过程,所以没有生成可读的makefile文件,但是它的实际构架过程也是这个过程.


简单的构建例子
如果我们不使用Clion,而是直接用命令行运行一个简单项目应该怎么办?
1.创建一个项目文件夹

mkdir my_project
cd my_project

2.创建一个main.cpp

vim main.cpp

随便写点Hello,world之类的

3.创建CMakelists.txt文件

vim CMakelists.txt

写入:
cmake_minimum_required(VERSION 3.24)
project(my_project)
set(CMAKE_CXX_STANDARD 17)
add_executable(my_project main.cpp)

4.创建一个build目录

mkdir build
cd build

5.执行cmake命令,会生成一个makefile

cmake ..

6.执行make命令,会生成一个可执行文件

make

7.执行可执行文件,输出结果

./可执行文件的名字

当然这只是一个最简单的例子
下面我们用Clion,利用CMakelists.txt写一个稍微复杂一丢丢的项目

接下来我将举一个简单例子,来讲一下CMakelists.txt的一些其他用法.

微项目
项目结构:

在这里插入图片描述
我们创建一个include的目录,用来存储头文件,因为我们在写C++项目时,需要有一个习惯,就是在.h文件中定义类和函数,但是并不写函数体,而是在.cpp文件中来完成函数体的部分.

Student.h:

#ifndef UNTITLED8_STUDENT_H
#define UNTITLED8_STUDENT_H
#include<string>

class Student
{
    int age;
    std::string name;
public:
    Student(std::string name)
    {
        this->name=name;
    }
    std::string get_name();
};
#endif //UNTITLED8_STUDENT_H

Student.cpp

#include "Student.h"

std::string Student::get_name() {
    return this->name;
}

当写到这里的时候就会出现点问题,当我们在写入
#include "Student.h"的时候会发现,这部分代码会标红,这是因为使用
Student.h跟Student.cpp不在同一个文件夹之下,我们可以使用

#include"../include/Student.h"

来引入这个头文件,但是这样太麻烦了,我们还是希望使用
#include"Student.h"这样简单的写法,所以我们可以在CMakelists.txt文件中写点东西:
在这里插入图片描述
加上这行之后,我们就可以直接使用 #include "Student.h"来引入了,include是头文件所在的目录名.


main.cpp

#include <iostream>
#include"Student.h"
int main() {

    Student *stu =new Student("sunjin,hello");
    std::cout<<stu->get_name()<<std::endl;

    return 0;
}

但是现在又有一个问题,我们需要在CMakelists.txt下,把Student.cpp也添加上去,否则Student.cpp是不会被编译的

在这里插入图片描述
我们可以用
aux_source_directory给 ./src下面所有的文件起一个别名,然后把这个别名
加入到 add_executable中,这样src目录下面(一级)的所有文件就都能被编译了,但是这样并不能编译子目录下的文件,需要再用别名.

cmake_minimum_required(VERSION 3.24)

project(untitled8)

set(CMAKE_CXX_STANDARD 17)

include_directories(include)

aux_source_directory(./src DIR)

add_executable(untitled8 ${DIR})

做好这些之后,我们可以点击运行键,然后就可以运行了,也可以自己建一个build目录,手动cmake和make.
up我不是匠人

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

群晖 NAS 外网访问设置 - 腾讯 DNSPod

目录 ​编辑 一、使用DNSPod&#xff0c;实现DDNS&#xff08;动态域名&#xff09; 二、公共概念厘清 三、腾讯DNSPod上详细设置步骤 1. 打开DNSPod.cn网站并登录 2. 登录成功后&#xff0c;选择【我的域名】-> 【添加域名】 3. 添加群晖NAS需要二级域名&#xff08…

安装 Kafka

文章目录 1.选择操作系统2.配置 Java 环境3.安装 ZooKeeper4.安装 broker&#xff08;1&#xff09;安装 broker&#xff08;2&#xff09;验证是否安装正确 5.配置 broker&#xff08;1&#xff09;常规配置&#xff08;2&#xff09;主题的默认配置 6.配置 Kafka 集群&#x…

一种新型智能优化算法—鼠群优化(RSO)算法

目录 一、RSO理论基础 二、RSO数学模型 2.1 追逐猎物 2.2 攻击猎物 三、RSO流程图 四、运行结果 鼠群优化(Rat Swarm Optimizer&#xff0c;RSO)算法是由Dhiman G等人于2020年提出&#xff0c;主要启发于老鼠追逐和攻击猎物的种群行为。该优化算法具有结构简单&#xf…

【Spring源码解读三】IoC容器之AnnotationConfigApplication的refresh()刷新方法其二

invokeBeanFactoryPostProcessors() PriorityOrdered接口 Ordered接口 invokeBeanDefinitionRegistryPostProcessors() registerBeanPostProcessors() getBeanNamesForType() initMessageSource() initApplicationEventMulticaster() onRefresh() registerListeners()…

go语言学习——9

文章目录 goroutine概念goroutine调度模型 channelchannel介绍定义/声明channelchannel的关闭channel遍历channel其他细节 goroutine 前言&#xff1a;统计1~90000000数字中&#xff0c;哪些是素数&#xff1f; 使用循环&#xff0c;很慢使用并发或者并行的方式&#xff0c;将任…

【保姆级】如何创建一个Vue工程

如何创建一个Vue工程 文章目录 如何创建一个Vue工程1、下载安装Node.js2、配置环境变量3、npm 安装淘宝镜像4、安装Vue CliVue 安装失败原因 5、在线创建工程创建工程启动服务启动报错停止服务重启服务 1、下载安装Node.js Node.js是一个js运行环境&#xff0c;Vue工程需要建立…

机器学习实战六步法之数据收集方法(四)

要落地一个机器学习的项目&#xff0c;是有章可循的&#xff0c;通过这六个步骤&#xff0c;小白也能搞定机器学习。 看我闪电六连鞭&#xff01;&#x1f923; 数据收集 数据是机器学习的基础&#xff0c;没有数据一切都是空谈&#xff01;数据集的数据量和数据的质量往往决…

有哪些比较好的游戏图标推荐

游戏图标设计在游戏UI中占有非常重要的地位。例如&#xff0c;当我们看到一个游戏的启动图标时&#xff0c;很容易区分它是哪个游戏。设计游戏图标不仅是一个图形&#xff0c;也是一个标志。 本文将通过各种游戏图标设计素材分享游戏图标的类别和设计游戏图标的思考。 1. 游戏…

HTTPS 协议

哥几个来学 HTTPS 协议 啦 ~~ 目录 &#x1f332;一、HTTPS 是什么&#xff1f; &#x1f333;二、何为 “加密” &#x1f334;三、HTTPS 的工作过程 &#x1f366;1. 引入对称加密 &#x1f367;2. 引入非对称加密 &#x1f368;3.引入证书 &#x1f332;一、HTTPS 是什…

如何学习和提升使用编程语言的能力? - 易智编译EaseEditing

学习编程语言并提升编程能力需要一定的学习方法和实践。以下是一些方法可以帮助你提升编程语言能力&#xff1a; 学习基本语法&#xff1a; 了解编程语言的基本语法和关键概念。可以通过阅读官方文档、教程、书籍或在线资源来学习。 编写代码&#xff1a; 编写实际的代码是提…

【深度学习】日常笔记

一开始感觉学习方向有点飘忽不定&#xff0c;后面查找资料和思考&#xff0c;发现其实图神经网络、异构图、推荐系统这三者的概念其实是相通&#xff0c;紧密联系的。推荐系统是指根据用户历史行为和偏好&#xff0c;为用户提供个性化的商品或服务推荐。而在推荐系统中&#xf…

用GANs来做数据增强

适用于只有很少样本的情况。 即使是不完美的合成数据也可以提高分类器的性能。 生成对抗网络(Generative adversarial networks&#xff0c;简称GANs)由Ian Goodfellow于2014年推出&#xff0c;近年来成为机器学习研究中非常活跃的话题。GAN是一种无监督生成模型&#xff0c;它…

基于word文档,使用Python输出关键词和词频,并将关键词的词性也标注出来

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 移船相近邀相见&#xff0c;添酒回灯重开宴。 大家好&#xff0c;我是Python进阶者。 一、前言 前几天在有个粉丝问了个问题&#xff0c;大概意思是这样…

一阶电路和二阶电路的时域分析(1)——“电路分析”

小雅兰期末加油冲冲冲&#xff01;&#xff01;&#xff01; 动态电路的方程及其初始条件 动态电路&#xff0c;物理学名词&#xff0c;是指含有储能元件L、C的电路&#xff0c;动态电路方程的阶数通常等于电路中动态元件的个数。 动态电路是指含有储能元件的电路。当动态电路状…

【Java】Java核心要点总结:58

文章目录 1. java中 怎么确保一个集合不能被修改2. 队列和栈是什么 有什么区别3. Java8开始的ConcurrentHashMap为什么舍弃了分段锁4. ConcurrentHashMap 和 Hashtable有什么区别5. ReadWriteLock和StampeLock 1. java中 怎么确保一个集合不能被修改 Java 中可以使用 Collectio…

计算机网络(数据链路层,复习自用)

数据链路层 数据链路层功能概述封装成帧与透明传输差错编码&#xff08;检错编码&#xff09;差错编码&#xff08;纠错编码&#xff09;流量控制与可靠传输机制停止-等待协议后退N帧协议&#xff08;GBN&#xff09;选择重传协议&#xff08;Selective Repeat&#xff09; 信道…

并行事务会引发的三个问题

并行事务是指同时运行多个事务&#xff0c;每个事务独立地执行&#xff0c;并且不会相互影响。在数据库管理系统中&#xff0c;当多个用户同时对同一个数据集进行读取或者写入的时候&#xff0c;使用并行事务可以提高系统的吞吐量和响应时间。同时&#xff0c;由于并行事务可以…

【MySQL 数据库】7、SQL 优化

目录 一、插入数据优化(1) insert 语句① 批量插入数据② 手动控制事务③ 主键顺序插入&#xff0c;性能要高于乱序插入 (2) load 大批量插入数据【☆❀ 二、主键优化(1) 数据组织形式(2) 页分裂(3) 页合并(4) 主键设计原则 三、orber by 优化四、group by 优化五、limit 优化&…

基于前推回代法的连续潮流计算研究【IEEE33节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

基于Java+Springboot+Vue的二次元商城网站设计与实现

博主介绍&#xff1a;✌擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案…
最新文章