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