CMake简介
使用简单方便,可以跨平台,构建项目编译环境。尤其比直接写Makefile简单(在构建大型工程编译时,需要写大量的文件依赖关系),可以通过简单的CMake生成负责的Makefile文件。
CMake安装
ubuntu上直接执行 sudo apt install cmake 安装完
可以通过cmake -version查看其版本:
CMake在Ubuntu的VScode安装插件
安装
CMake使用介绍
cmake命令会执行目录下的CMakeLists.txt配置文件里面的配置项,一个基本的CMakeLists.txt的配置文件内容如下:
示例
如果需要编译的有多个源文件,可以都添加到add_executable(main main.cpp test.cpp)列表当中,但是如果源文件太多,一个个添加到add_executable的源文件列表中,就太麻烦了,此时可以用aux_source_directory(dir var)来定义源文件列表,使用如下:
aux_source_directory()也存在弊端,它会把指定目录下的所有源文件都加进来,可能会加入一些我们不需要的文件,此时我们可以使用set命令去新建变量来存放需要的源文件,如下
一个正式的工程构建
应该有以下目录
静态库和动态库的编译控制
最外层的CMakeLists.txt是总控制编译,内容如下:
src里面的源代码要生成静态库或动态库,CMakeLists.txt内容如下:
test里面的CMakeLists.txt内容如下:
CMake常用的预定义变量
CMake构建集成编译环境(1)
我们把上一篇博客写的muduo_server.cpp用cmake构建编译环境
我们在编译出可执行文件需要执行下面这个命令行
涉及到 可执行文件,编译参数(-g)(优化级别-O)(这些是编译选项),源文件,头文件的搜索路径,库文件的搜索路径,要链接的库
CMake命令就是从项目的根目录开始找CMakeLists.txt文件。
我们首先在testmuduo下创建CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(main)
# 配置编译选项
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g)
# 配置头文件搜索路径
# 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)
保存。我们打开终端,进入到testmuduo文件夹下,执行cmake .
根据我们配置的东西进行编译。
然后执行make,make就会去找Makefile
CMake构建集成编译环境(2)
我们在示例1中,生成了那么多编译文件。怎么办?
我们在项目中应该这么做:
在项目下创建一个bin目录:生成的可执行文件
lib目录:生成的库文件
include:生成的头文件
src:源文件
build:编译过程中产生的临时的中间文件
test:测试文件
example:示例
thirdparty:依赖的第三方库
然后再放一个:CMakeLists.txt
然后我们可以再放一个:autobuild.sh一键编译
我们把上一节生成的编译文件删除掉
我们在testmuduo下创建一个build文件夹
我们希望把编译的中间文件都放到build里面
我们新增这一行:
# 设置可执行文件最终存储的路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
我们进入到build里面。
执行
cmake ..
然后我们再执行make
可执行文件在bin里面
CMake构建集成编译环境(3)
因为我要完成集群聊天服务器这个项目,我要将CMakeLists.txt调整一下
我在chatserver下再创建一个CMakeLists.txt