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我不是匠人
相关文章:

Cmake工具的简单使用
引言 本篇文章讲述如何简单的使用cmake工具构建一个项目,帮助入门的c新手学会如何使用cmake. 我们在Clion新创建一个项目时,会发现,除了main.cpp文件之外,还存在一个build-debug目录和一个CMakelists.txt文件,如图: …...

html选择器
基本选择器 基本选择器 : 标签选择器 , 类选择器 , ID选择器 标签选择器 代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEed…...

Leetcode 剑指 Offer II 030. 插入、删除和随机访问都是 O(1) 的容器
题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作…...

django实现读取数据导出生成excel表格
目录 一、简单示例: 1.创建文件对象: 2.添加工作表: 3.写入数据: 二、实践出真理 需要先安装xlwt模块 pip install -i https://pypi.douban.com/simple xlwt一、简单示例: import xlwt# 创建一个Excel文件对象 …...

DevOps系列文章之 Docker-compose
一,Docker-compose全集 1,Docker-compose简介 Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层,分别是工程(project),…...
Vue Router入门:轻松构建单页应用程序
Vue.js是一种流行的前端JavaScript框架,可以让开发人员轻松构建动态用户界面。Vue.js的一个关键特性是其路由系统,它使得开发人员可以轻松创建具有多个视图和页面的单页应用程序(SPA)。在本文中,我们将探讨如何使用Vue Router在Vue.js中构建SPA。我们将介绍如何安装和配置…...

ITSM 如何帮助制造业企业
ITSM在现代制造业中的作用 在过去的几年中,制造业已经看到了快速的数字化,以智能制造技术改进生产技术。在工业4.0和工业5.0的推动下,制造商正在摆脱陈旧 以及利用物联网、人工智能、机器学习和大数据等先进技术的互联智能制造系统ÿ…...
leecode
leecode20,有效的括号,栈 class Solution:def isValid(self, s: str) -> bool:def check(ch1,ch2):if ch1 [ and ch2 ]:return Trueelif ch1 ( and ch2 ):return Trueelif ch1 { and ch2 }:return Trueelse:return Falsestack []for i in ran…...
2023-06-09 LeetCode每日一题(修改图中的边权)<未来补全>
2023-06-09每日一题 一、题目编号 2699. 修改图中的边权二、题目链接 点击跳转到题目位置 三、题目描述 给你一个 n 个节点的 无向带权连通 图,节点编号为 0 到 n - 1 ,再给你一个整数数组 edges ,其中 edges[i] [ai, bi, wi] 表示节点…...
Linux 应用程序信号量使用实战
背景 在项目实施过程中,有个机制需要做两个线程之间的同步。 具体需求如下: 首先,线程1需要把资源读取到缓存 其次,线程2才可以操作这块缓存 上述两个动作顺序交替重复。 思路 使用信号量解决思路,申请两个信号…...

【Java多线程进阶】synchronized工作原理
前言 本期讲解 synchronized 工作的原理以及常见的锁优化机制,相信大家在看完这篇博文后对 synchronized 工作流程有一定的理解。话不多说,让我们快速进入学习吧~ 目录 1. 锁的工作流程 2. 偏向锁 3. 轻量级锁和重量级锁 3.1 轻量级锁 3.2 重量级锁…...

C语言经典题目(三)
C站的小伙伴们,大家好呀!😊😊✨✨这一篇是C语言之经典题目篇,除程序设计,还有一些不错的程序分析,快来和我一起进入C语言的世界吧!✨✨✨ 💕C语言其他刷题篇在这里哦&…...

九、(补充文章四)Arcgis实现深度学习训练样本数据的批量制作——只靠原图+shp如何批量制作样本图片
之前写了一些个深度学习系列文 其中先是单张样本的制作方法 最后通过构造模型批量处理 大大提高了生成样本的速度 四、Arcgis实现深度学习河流训练样本数据的制作(使用软件批量获取样本图片)——对已经获取到的完整面状样本数据进行处理 但是这个方法不仅仅需要shp和原图 还需要…...

MKS SERVO4257D 闭环步进电机_系列8 CAN通讯示例
第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口,支持MODBUS-RTU通讯协议,内置高效FOC矢量算法,采用高精度编码器,通过位置反馈&a…...

UnityVR--组件9--视频组件VideoPlayer
目录 前言 参数解释 RenderMode渲染方式 VideoPlayer类中的API 前言 在之前的VR场景中已经使用过VideoPlayer播放视频(Unity.UI的交互(6)-播放视频),不过在VR中设置是有些不同的,这里更详细地说明一下V…...
Java 深拷贝和浅拷贝
Java 中的深拷贝和浅拷贝是针对对象复制而言的。 浅拷贝(Shallow Copy) 当对象进行浅拷贝时,只会复制对象本身和其中的基本数据类型属性,而不会复制引用对象的实际内容。具体而言,浅拷贝只会创建一个新的对象&#x…...
[ruby on rails] docker
docker安装 ubuntu14.04后自带docker安装包,可以直接安装 sudo apt-get updatesudo apt-get install -y docker.io# 安装后启动sudo service docker start查看docker信息 docker infodocker命令 sudo service docker start sudo service docker stop sudo servic…...

网络协议——STP协议是什么?是如何实现的?
作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 目录 一、STP协议是什么 二、为什么需要STP协议 三、STP的实现过程 编辑 1、选举跟桥 2、给非跟桥交换机选举跟端口 3、给每个网段选…...

【C++】智能指针 学习总结 |std::shared_ptr |std::unique_ptr | std::weak_ptr
文章目录 前言一、智能指针介绍二、普通指针和智能指针的比较案例三、std::shared_ptr四、std::unique_ptr五、std::weak_ptr六、std::shared_ptr |std::unique_ptr | std::weak_ptr三大智能指针的区别 前言 参考答案:chatgpt 一、智能指针介绍 智能指针是C的一种…...
iptables防火墙
文章目录 一.linux防火墙基础1.linux 包过滤防火墙概述1.1netfilter1.2 iptables 2.包过滤的工作层次2.1 通信的五元素和四元素 3.iptables 的表、链结构3.1 规则链3.2 默认包括5种规则链3.3 规则表3.4 默认包括4个规则表 二.数据包过滤的匹配流程1.规则表之间的顺序2.规则链之…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...