当前位置: 首页 > news >正文

集群聊天服务器项目【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还需要其他额外的配置,后面会再详细介绍。

http://www.lryc.cn/news/441025.html

相关文章:

  • Nginx+Tomcat(负载均衡、动静分离)
  • 前端分段式渲染较长文章
  • C#程序员的堕落从nuget开始:将自己的代码发布到nuget
  • 【C/C++语言系列】malloc、calloc和realloc区别和用法
  • 【Linux】POSIX信号量与、基于环形队列实现的生产者消费者模型
  • Spring Boot-消息队列相关问题
  • [数据集][目标检测]岩石种类检测数据集VOC+YOLO格式4766张9类别
  • 图像分割基本知识
  • LIN总线CAPL函数——干扰LIN帧响应段(linInvertRespBit )
  • 【30天玩转python】网络编程基础
  • 【PCB工艺】如何实现PCB板层间的互连
  • FastAPI--如何自定义Docs UI,包括多个APP、静态资源、元数据等
  • 【FPGA XDMA AXI Bridge 模式】PCIe:BARs 和 AXI:BARs 含义解析
  • 嵌入式-QT学习-小练习
  • 使用 Flask-Limiter 和 Nginx 实现接口访问次数限制
  • 【数据结构】排序算法---冒泡排序
  • mysql数据库中事务锁的机制
  • 并发工具类-CountDownLatch
  • 进程的重要函数
  • python 实现average median平均中位数算法
  • HTML概述
  • 【FFT】信号处理——快速傅里叶变换【通俗易懂】
  • 电脑升级WIN11之后需要注意哪些东西
  • GEE 教程:利用sentinel-5p数据进行长时序CO一氧化碳的监测分析并结合夜间灯光数据分析
  • 【教程】鸿蒙ARKTS 打造数据驾驶舱---前序
  • Html css样式总结
  • 决策树基础概论
  • Spring Boot集成Akka Cluster快速入门Demo
  • django学习入门系列之第十点《A 案例: 员工管理系统10》
  • Unity实战案例全解析:PVZ 植物卡片状态分析