集群聊天服务器项目【C++】(四)cmake介绍和简单使用
我们上次用shell命令和vscode编译链接muduo库服务端代码,本章节实现编写CMakeLists.txt来编译项目。本次简单介绍CMake,并用Cmake编译上次的muduo服务器代码。
1.为什么使用cmake
我们在编译项目时,如果编写Makefile的话,常常会很麻烦,需要写大量的依赖关系。然而CMake使用简单方便,可以跨平台,直接生成一个Makefile。因此我们可以选择编写CMakeLists.txt文件,自动生成Makefile文件。
2.CMake安装
我们在安装muduo库时已经安装了CMake了,但为了讲解CMake完整,本次也简单介绍下CMake安装:
sudo apt install cmake
查看版本:
cmake -version
3.VSCode配置CMake
为了在使用vscode时由代码提示,我们在vscode远程安装CMake Tools和CMake两个插件。然后cmake tools设置点击扩展设置:
然后添加环境变量:

4.cmake实现上一章的muduo服务器项目
首先先看下目录结构:

这是最简单的文件结构了,我们看看CMake怎么生成一个Makefile文件。
一般我们在终端需要使用以下指令去编译链接等操作:
g++ -o 编译结果(可执行文件/*.a/*.so) 需要编译的源文件列表 -编译选项(-g/-o等) 多个*.cpp -I头文件搜索路径 -L库文件搜索路径 -l库文件名
列如我们在本列中使用以下指令:
g++ -o server muduo_server.cpp -lmuduo_net -lmuduo_base -lpthread
我们在CMakeLists.txt中输入以下信息,每段内容会注释介绍
cmake_minimunm_required(VERSION 3.0) //最低的cmake版本
project(项目名称)
# 配置编译选项
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g) ##CMAKE_CXX_FLAGS是CMake预定义变量:设置 C++ 编译选项
# 配置头文件搜索路径
# include_directories()
# 配置库文件搜索路径
# link_directories()# 设置需要编译的源文件列表
set(SRC_LIST ./muduo_server.cpp)# 设置可执行文件最终存储的路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)# 把.指定路径下的所有源文件名字放入变量名SRC_LIST里面(因为一个一个添加会很麻烦)
# aux_source_directory(. SRC_LIST)# 表示生成可执行文件server,由SRC_LIST变量所定义的源文件编译而来
add_executable(server ${SRC_LIST})
# 表示server这个目标程序,需要连接muduo_net muduo_base pthread这三个库文件
target_link_libraries(server muduo_net muduo_base pthread)
然后使用cmake 生成Makeflie文件
cmake CMakeLists.txt

由上图可见生成了很多新的文件,除了Makefile文件,其他都是临时文件,可以删除。
然后我们使用make命令去执行Makefile文件
make
最终在bin中生成了可执行文件。
但是生成了很多临时文件,我们可以希望生成的临时文件不影响原来的文件,我们可以在创建一个build文件夹,在这个文件下下使用cmake,这样临时文件都在build文件下,目录结构如下:

在build文件夹下执行cmake,生成Makefile和其他临时文件
cmake ..
目录结果:

使用make执行Makefile:
make
结果如下:

在bin目录下生成了可执行文件。
总结
本章介绍了为什么使用cmake:比手写Makefile简单,cmake安装、vscode配置,以及用cmake编译上一章的代码。但是对于一个复杂的项目,使用cmake还需要其他额外的配置,后面会再详细介绍。
相关文章:
集群聊天服务器项目【C++】(四)cmake介绍和简单使用
我们上次用shell命令和vscode编译链接muduo库服务端代码,本章节实现编写CMakeLists.txt来编译项目。本次简单介绍CMake,并用Cmake编译上次的muduo服务器代码。 1.为什么使用cmake 我们在编译项目时,如果编写Makefile的话,常常会…...
Nginx+Tomcat(负载均衡、动静分离)
目录 一、Nginx概述 1.Nginx应用 二、正向代理和反向代理 1.正向代理 1.1主要作用 1.2工作原理 2.反向代理 2.1主要作用 2.2工作原理 三、负载均衡模式 1.轮询 2.最少连接数 3.IP 哈希 4.加权轮询 5.最少时间算法 6.一致性哈希 四、规划部署负载均衡和反向…...
前端分段式渲染较长文章
实现思路: 1. 后端返回整篇文章。 2. JavaScript 分段处理:将文章按一定的字符或段落长度分割,然后逐步将这些段落追加到页面上。 3. 定时器或递归调用:使用 setInterval 或 setTimeout 来控制段落的逐步渲染。 代码实现示例 …...
C#程序员的堕落从nuget开始:将自己的代码发布到nuget
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
【C/C++语言系列】malloc、calloc和realloc区别和用法
这三个函数都是在堆区分配内存的函数,头文件都是: #include<stdlib.h>下面分别介绍这三个函数: malloc: 函数原型: void *malloc(unsigned int num_bytes);功能:堆区开辟一段内存空间 num_nytes&…...
【Linux】POSIX信号量与、基于环形队列实现的生产者消费者模型
目录 一、POSIX信号量概述 信号量的基本概念 信号量在临界区的作用 与互斥锁的比较 信号量的原理 信号量的优势 二、信号量的操作 1、初始化信号量:sem_init 2、信号量申请(P操作):sem_wait 3、信号量的释放(…...
Spring Boot-消息队列相关问题
Spring Boot 消息队列相关问题及解决方案 消息队列(Message Queue, MQ)在分布式系统中的应用越来越广泛,尤其是在解耦系统、异步通信、负载均衡等场景中起到了至关重要的作用。消息队列为不同的服务提供了一种异步通信的机制,使得…...
[数据集][目标检测]岩石种类检测数据集VOC+YOLO格式4766张9类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4766 标注数量(xml文件个数):4766 标注数量(txt文件个数):4766 标注…...
图像分割基本知识
计算机视觉和图像处理 Tensorflow入门深度神经网络图像分类目标检测图像分割 图像分割 一、目标分割1.1 图像分割的定义1.2 任务类型1.2.1 任务描述1.2.2 任务类型 二、语义分割2.1 FCN网络2.1.1网络结构 2.2 Unet网络 三、UNet案例3.1 数据集获取3.1.1 设置相关信息3.1.2 图像…...
LIN总线CAPL函数——干扰LIN帧响应段(linInvertRespBit )
🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…...
【30天玩转python】网络编程基础
网络编程基础 网络编程是指编写能够在网络上进行通信的程序,通过网络进行数据的发送与接收。Python 提供了许多库和工具来进行网络编程,如 socket、urllib 和 requests。在这篇文章中,我们将介绍网络编程的基础知识,并演示如何使…...
【PCB工艺】如何实现PCB板层间的互连
系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言①、什么是通孔②、通孔是怎样产生的③、通孔种类④、盘中孔⑤、设计建议 前言 送给大学毕业后找不到奋斗方向的你…...
FastAPI--如何自定义Docs UI,包括多个APP、静态资源、元数据等
如何mount 一个FastAPI Application? “Mounting” means adding a completely “independent” application in a specific path, that then takes care of handling everything under that path, with the path operations declared in that sub-application. 示例代码 主…...
【FPGA XDMA AXI Bridge 模式】PCIe:BARs 和 AXI:BARs 含义解析
一. XDMA IP核两种模式 Xilinx的 DMA/Bridge Subsystem for PCI Express IP核中,支持普通的XDMA模式,但是这种模式只允许主机端发起PCIe 读写请求,FPGA内部无法主动发起读写请求,也即FPGA无法主动读写HOST的内存。 而该IP核的另…...
嵌入式-QT学习-小练习
1. 实现多窗口 2. 给按键增加图标 3. 动图展示 结果演示: Mul_Con main.cpp #include "widget.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }一、第一个窗口展示 …...
使用 Flask-Limiter 和 Nginx 实现接口访问次数限制
在现代 Web 应用中,针对敏感接口(如短信验证码、登录接口等)的访问次数限制至关重要。通过设置合理的限流策略,可以有效防止接口滥用,避免过多的资源消耗,并提升安全性。本文将通过 Nginx 和 Flask-Limiter…...
【数据结构】排序算法---冒泡排序
文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaCGo 结语 1. 定义 冒泡排序(英语:Bubble sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的…...
mysql数据库中事务锁的机制
读锁又称为共享锁,简称S锁,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。 写锁又称为排他锁,简称X锁,排他锁就是不能与其他所并存,如一个事务获取了一个…...
并发工具类-CountDownLatch
CountDownLatch 是 Java 中提供的一种非常有用的并发工具类,位于 java.util.concurrent 包中。它可以使一个或多个线程等待其他线程完成一组特定的操作后再继续执行。CountDownLatch 通过维护一个计数器来实现这一点,计数器的初始值由构造函数设定。每当…...
进程的重要函数
进程的重要函数: fork函数 了解fork函数 通过调用fork()函数,则会产生一个新的进程。调用fork()函数的进程叫做 父进程,产生的新进程则为子进程。 其编码过程: 1.函数功能: 函数头文件 #include <sys/types.h> #include <unistd.h> 函数…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用 Linux 内核内存管理是构成整个内核性能和系统稳定性的基础,但这一子系统结构复杂,常常有设置失败、性能展示不良、OOM 杀进程等问题。要分析这些问题,需要一套工具化、…...
信息系统分析与设计复习
2024试卷 单选题(20) 1、在一个聊天系统(类似ChatGPT)中,属于控制类的是()。 A. 话语者类 B.聊天文字输入界面类 C. 聊天主题辨别类 D. 聊天历史类 解析 B-C-E备选架构中分析类分为边界类、控制类和实体类。 边界…...
安宝特案例丨寻医不再长途跋涉?Vuzix再次以AR技术智能驱动远程医疗
加拿大领先科技公司TeleVU基于Vuzix智能眼镜打造远程医疗生态系统,彻底革新患者护理模式。 安宝特合作伙伴TeleVU成立30余年,沉淀医疗技术、计算机科学与人工智能经验,聚焦医疗保健领域,提供AR、AI、IoT解决方案。 该方案使医疗…...
