集群聊天服务器项目【C++】(四)cmake介绍和简单使用

news2024/12/23 19:47:33

我们上次用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还需要其他额外的配置,后面会再详细介绍。

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

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

相关文章

大数据处理技术:MapReduce综合实训

目录 1 实验名称 2 实验目的 3 实验内容 4 实验原理 5 实验过程或源代码 5.1 WordCount词频统计 5.2 HDFS文件读写 5.3 倒排索引 5.4 网页排序——PageRank算法 6 实验结果 6.1 WordCount词频统计 6.2 HDFS文件读写 6.3 倒排索引 6.4 网页排序——PageRank算法 1…

无人机飞手教员组装、调试高级教学详解

随着无人机技术的飞速发展,其在航拍、农业、救援、监测等多个领域的应用日益广泛,对专业无人机飞手的需求也随之增加。作为无人机飞手教员,掌握无人机的高级组装、调试技能不仅是教学的基础,更是培养学生成为行业精英的关键。本教…

面试官问:你为什么对这个职位感兴趣?

当面试官问到你为什么对某个职位感兴趣时,你的回答应该反映出你对该职位的热情,以及你如何能够为公司带来价值。 重点:在面试前一定要去研究下这家公司,包括他们的团队,文化,产品,服务等各个方…

SOMEIP_ETS_109: SD_Do_not_specify_a_port

测试目的: 验证DUT能够拒绝不包含端口号(端口号为0)的SubscribeEventgroup消息。 描述 本测试用例旨在确保DUT遵循SOME/IP协议,当接收到没有指定端口的SubscribeEventgroup消息时,能够正确地拒绝该订阅尝试。 测试…

单链表各种接口的实现(C)

顺序表的优缺点 顺序表的问题 头部和中部的插入删除效率都不行, O ( N ) O(N) O(N)空间不够了,扩容有一定消耗(尤其是异地扩容)开新空间,拷贝数据,释放旧空间扩容逻辑,可能还存在空间浪费 多扩…

Springboot项目总结

1.为了调用写在其他包里面的类的方法 但是不使用new来实现调用这个类里面的方法,这个时候我们就需要将这个类注入到ioc容器里面,通过ioc容器来实现自动生成一个对象。 对ioc容器的理解:自动将一个对象实现new. 考察了and 和 or组合使用&…

vscode技巧-eslint配置

开发环境 jsvue3axios 下载插件 Eslint、Prettfier 配置过程 1.配置eslint 进入settings,输入eslint,在settings.json中替换一下文件 // #每次保存的时候自动格式化 {"editor.codeActionsOnSave": {"source.fixAll.eslint": &…

海康威视摄像机和录像机的监控与回放

文章目录 海康威视摄像机和录像机的监控与回放1、海康威视监控设备简介1.1、摄像机二次开发1.1.1:协议选择1.1.2:ffmpeg软件转流 2、各种流媒体协议介绍2.1:流媒体协议介绍2.1.1:RTSP (实时流传输协议)2.1.2:RTMP (实时…

Java语言程序设计基础篇_编程练习题**18.26 (创建一个迷宫)

目录 题目:**18.26 (创建一个迷宫) 习题思路 代码示例 输出结果 题目:**18.26 (创建一个迷宫) 编写一个程序,在迷宫中寻找一条路径,如图18-13a所示。该迷宫由一个8 x 8 的棋盘表示。路径必须满足下列条件: 路径在迷…

日志收集工具 Fluentd vs Fluent Bit 的区别

参考链接: FluentdFluentd BitFluentd & Fluent Bit | Fluent Bit: Official Manual Fluentd 与 Fluent Bit 两者都是生产级遥测生态系统! 遥测数据处理可能很复杂,尤其是在大规模处理时。这就是创建 Fluentd 的原因。 Fluentd 不仅仅是…

国产化中间件正在侵蚀开源中间件

开源中间件的发展趋势表明,它们将继续在技术创新和生态建设中发挥重要作用,尤其是在云计算、大数据等新兴技术领域。开源中间件如Apache Kafka、RabbitMQ、ActiveMQ和RocketMQ等在市场上有着广泛的应用。它们在技术社区中得到了良好的支持,并…

k8s中控制器的使用

目录 一、什么是控制器 二、控制器常用类型 三、replicaset控制器 1、replicaset功能 2、replicaset参数说明 3、replicaset示例 四、deployment控制器 1、deployment控制器的功能 2、deployment控制器示例 (1)版本迭代 (2&#x…

MySql的基础讲解

一、初识MySql 数据库:按照数据结构来组织、存储和管理数据的仓库;是一个长期存储在计算机内的、有组织的、可共享 的、统一管理的大量数据的集合; OLTP:联机事务处理,主要是对数据库的增删改查。 OLTP 主要用来记录…

【研赛论文】数学建模2024华为杯论文word/latex模板

国赛结束,研究生瞩目的研赛马上就要来了,相信研究生同学也是在努力的准备当中,在这里祝愿大家能够获得一个好的名次。一举冲出重围,拿下国奖。在数模比赛当中,论文是参赛者唯一能够与评阅老师进行沟通的方式&#xff0…

【Python爬虫系列】_021.异步请求aiohttp

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈

本地部署大模型并使用知识库Windows下Ollama+Docker+MaxKB安装的记录

概要 本文介绍本地部署大模型和知识库的小白方法,可以运行较多种类的大模型,使用的软件为docker和ollama以及MaxKb作为知识库前端。 下载 各安装包可以百度去官网或者github下载或使用,也可以点击下面的的链接和我下载相同的版本。 ollama…

uniapp child.onFieldChange is not a function

uni-forms // 所有子组件参与校验,使用 for 可以使用 awiatfor (let i in childrens) {const child childrens[i];let name realName(child.name);if (typeof child.onFieldChange function) {const result await child.onFieldChange(tempFormData[name]);if (result) {…

如何准备教师资格证科目三“学科知识与教学能力”的考试与面试?(理科导向:数学/物理)

如何准备教师资格证科目三“学科知识与教学能力”的考试与面试?(理科导向:数学/物理) ​ 目录 收起 1 前言 1.1 自身经历 1.2 教师资格证的作用 2 知识点题型分数的分布与学习建议 2.1 科目三的知识点分数分布: …

Python 全栈系列271 微服务踩坑记

说明 这个坑花了10个小时才爬出来 碰到一个现象:将微服务改造为并发后,请求最初很快,然后就出现大量的失败,然后过一会又能用。 过去从来没有碰到这个问题,要么是一些比较明显的资源,或者逻辑bug&#xff0…

Matlab simulink建模与仿真 第十三章(信号通路库)

参考视频:simulink1.1simulink简介_哔哩哔哩_bilibili 一、信号通路库中的模块概览 1、信号通路组 注:部分模块在第二章中有介绍,本章不再赘述。 2、信号存储和访问组 二、总线分配模块 Bus Assignment模块接受总线作为输入,并…