Cmake工具的简单使用

news2024/11/28 1:42:20

引言
本篇文章讲述如何简单的使用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++11
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.coloradmin.cn/o/628835.html

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

相关文章

Spring Boot 集成 Redisson 实现分布式锁

Redisson 是一种基于 Redis 的 Java 驻留集群的分布式对象和服务库&#xff0c;可以为我们提供丰富的分布式锁和线程安全集合的实现。在 Spring Boot 应用程序中使用 Redisson 可以方便地实现分布式应用程序的某些方面&#xff0c;例如分布式锁、分布式集合、分布式事件发布和订…

Java学习记录

引入包 把jar包复制到lib下面&#xff0c;然后右键add as library 常用方法 读取文件&#xff1a;FileInputStream获得当前路径&#xff1a;System.getProperty(“user.dir”) 快捷键 https://blog.csdn.net/W_317/article/details/114300373 常用的 生成循环&#xff1…

VMware Workstation 16 安装教程

哈喽&#xff0c;大家好。今天一起学习的是VMware Workstation 16的安装&#xff0c;vm虚拟机是小编非常喜欢的生产力软件&#xff0c;小编之前发布的测试教程钧在vm上进行的实验。 VMware Workstation是一款功能强大的桌面虚拟计算机软件&#xff0c;它能够让用户在宿主机操作…

Coggle 30 Days of ML 打卡任务一:两个赛题数据可视化

Coggle 30 Days of ML 打卡任务一&#xff1a;两个赛题数据可视化 任务一&#xff1a;两个赛题数据可视化 难度/分值&#xff1a;低/1 打卡内容&#xff1a; 参赛选手名称&#xff1a;AppleDoctor完成日期&#xff1a;2023.6.6任务完成情况&#xff1a; 使用的编程语言&…

【你真的会斗图嘛?】Python爬虫实战项目——你想要的图都可以爬到(附安装地址)

目录 一、安装知识&#xff08;1&#xff09;Python环境变量&#xff08;2&#xff09;Pycharm开发工具&#xff08;3&#xff09;requests模块1、安装下载好Pycharm之后&#xff0c;找到终端进行下载requests模块2、输入下载语法&#xff1a;3、此次项目还需用到正则&#xff…

【STM32】制作一个bootloader

工作环境&#xff1a;STM32CubeMXKeil 相关环境准备这里就不介绍了。 bootloader是什么 bootloader就是单片机启动时候运行的一段小程序&#xff0c;这段程序负责单片机固件的更新&#xff0c;也就是单片机选择性的自己给自己下载程序。可以更新&#xff0c;可以不更新&…

C++课程设计:电梯控制系统程序设计

目录 电梯控制系统程序设计背景 类结构图 程序设计 程序释义 运行展示 总结与体会 电梯控制系统程序设计背景 电梯控制系统程序设计旨在通过C编程实现电梯的模拟功能&#xff0c;使用户能够选择上行或下行&#xff0c;并输入要进入的楼层&#xff0c;程序将模拟电梯运行过…

死锁细究!

一、死锁的定义&危害 1、死锁是什么 发生在并发中互不想让&#xff1a;当两个&#xff08;或更多&#xff09;线程&#xff08;或进程&#xff09;相互持有对方所需要的资源&#xff0c;又不主动释放&#xff0c;导致所有人都无法继续前进&#xff0c;导致程序陷入无尽的…

学生成绩管理系统(C语言)

学生成绩管理系统 一、实现思路二、代码的实现&#xff08;1&#xff09;构造功能框架&#xff08;2&#xff09;实现各项功能 三、完整的代码四、总结 本篇博客介绍一个关于学生成绩管理系统的C语言代码&#xff0c;包含读取成绩、计算各门课程的总分和平均分、按分数排序、按…

快速实现一个分布式定时器

定时器&#xff08;Timer&#xff09;是一种在业务开发中常用的组件&#xff0c;主要用在执行延时通知任务上。本文以笔者在工作中的实践作为基础&#xff0c;介绍如何使用平时部门最常用的组件快速实现一个业务常用的分布式定时器服务。同时介绍了过程中遇到问题的一些解决方案…

手机越狱:探索自由与风险的边界

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

100天精通Golang(基础入门篇)——第5天: Go语言中的数据类型学习

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

htmlCSS-----盒模型

目录 前言&#xff1a; 盒子 1.内容区域 2. 边框 3. 内边距区域 4. 外边距区域&#xff08;margin&#xff09; 怪异盒模型 前言&#xff1a; 前面我们学习了CSS中的选择器的使用方法&#xff0c;那这一节我们就学习CSS中的盒模型&#xff0c;通过盒模型我们可以去更好的…

uni-app引入html2canvas截图以及截长图

下载安装html2canvas 方式一&#xff0c;https://www.bootcdn.cn/ CDN网站下载html2canvas插件 这里下载后放在测项目目录common下面 页面中引入 方式二、npm方式安装html2canvas 1、npm方式下载 npm i html2canvas2、引入html2canvas import html2canvas from html2can…

数据结构——广义表

文章目录 前言二、特殊矩阵的压缩存储数组的存储结构和实现按行优先存储按列优先存储 矩阵的压缩存储稀疏矩阵 广义表 总结 前言 数组&#xff0c;数组的压缩存储&#xff0c;广义表 二、特殊矩阵的压缩存储 数组的存储结构和实现 对于多维数组&#xff0c;可以分为按行优先…

UnityVR--组件9--视频组件VideoPlayer

目录 前言 参数解释 RenderMode渲染方式 VideoPlayer类中的API 前言 在之前的VR场景中已经使用过VideoPlayer播放视频&#xff08;Unity.UI的交互&#xff08;6&#xff09;-播放视频&#xff09;&#xff0c;不过在VR中设置是有些不同的&#xff0c;这里更详细地说明一下V…

8.面向对象编程(高级部分)|Java学习笔记

文章目录 类变量和类方法类变量类变量使用注意事项和细节 类方法类方法使用注意事项和细节 理解 main 方法语法代码块代码块使用注意事项和细节讨论 单例设计模式单例模式应用实例饿汉式 VS 懒汉式 final 关键字final 使用注意事项和细节 抽象类抽象类的介绍抽象类使用的注意事…

软件测试|测试金字塔是什么,它的目的是什么,以及它包含哪些层次?

一、测试金字塔的概念&#xff1a; 测试金字塔是2009年Mike Cohn在他的著作《Succeeding with Agile》一书正式提出的。他是一个类比的概念&#xff0c;形容每一层&#xff0c;或者说不同集成阶段测试覆盖率和知行效率之间的一个相对关系。 测试金字塔最初的原型分三层&#…

chatgpt赋能python:Python循环间隔-了解如何在循环中增加延时

Python循环间隔 - 了解如何在循环中增加延时 在Python编程中&#xff0c;循环是非常常见且重要的控制语句。 它使我们可以多次执行代码块。 但是&#xff0c;在有些情况下&#xff0c;您可能需要在循环之间增加一定的延时时间。 这就是Python循环间隔的概念。 在本文中&#x…

初次使用PPYOLOE-R

目的&#xff1a;优化基于yolov5-obb旋转目标检测算法的证件区域检测&#xff0c;之前的方法是基于anchor&#xff0c;每次使用都要调试anchor&#xff1b;而ppyoloe-r是free anchor的算法&#xff1b; 源码位置&#xff1a;https://github.com/PaddlePaddle/PaddleDetection/…