当前位置:网站首页>CMake的学习
CMake的学习
2022-07-23 21:17:00 【_索伦】
CMake简介
使用简单方便,可以跨平台,构建项目编译环境。尤其比直接写Makefile简单(在构建大型工程编译时,需要写大量的文件依赖关系),可以通过简单的CMake生成负责的Makefile文件。
CMake安装
ubuntu上直接执行 sudo apt install cmake 安装完成,可以通过cmake -version查看其版本:

CMake使用简介
cmake_minimum_required (VERSION 3.0) #要求cmake最低的版本号
project (demo) # 定义当前工程名字
set(CMAKE_BUILD_TYPE "Debug") # 设置debug模式,如果没有这一行将不能调试设断点
set(CMAKE_CXX_FLAGS ${
CMAKE_CXX_FLAGS} -g)
add_executable(main main.c)
# 进入子目录下执行 CMakeLists.txt文件 这里的lib和tests里面都有可编译的代码文件
add_subdirectory(lib)
add_subdirectory(tests)
如果需要编译的有多个源文件,可以都添加到add_executable(main main.cpp test.cpp)列表当中,但是如果源文件太多,一个个添加到add_executable的源文件列表中,就太麻烦了,此时可以用
aux_source_directory(dir var)来定义源文件列表,使用如下:
cmake_minimum_required (VERSION 3.0)
project (demo)
aux_source_directory(. SRC_LIST) # 定义变量,存储当前目录下的所有源文件
add_executable(main ${
SRC_LIST})
aux_source_directory()也存在弊端,它会把指定目录下的所有源文件都加进来,可能会加入一些我们不需要的文件,此时我们可以使用set命令去新建变量来存放需要的源文件,如下:
cmake_minimum_required (VERSION 3.0)
project (demo)
set( SRC_LIST
./main.cpp
./test.cpp)
add_executable(main ${
SRC_LIST})
使用示例
muduo网络库的服务器,在编译链接时的命令:

在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)
# 最终生成的文件, 通过谁来生成
add_executable(server ${
SRC_LIST})
# 表示server这个目标程序,需要连接muduo_net muduo_base pthread这三个库文件
target_link_libraries(server muduo_net muduo_base pthread)
在build文件夹下执行cmake …

再执行make
CMakeLists.txt里编写的最终生成可执行文件在bin目录下,所以去bin里面。
运行示例:

为什么用CMake
有人会问,我这只有一个cpp源文件,使用CMake后生成了那么多文件,那看起来好麻烦:
原因:在实际开发过程中,一个工程大致包含以下模块:
最终生成的可执行文件、中间库文件、头文件、源文件、CMake生成的文件、测试文件、第三方库文件、CMake文件,自动化编译脚本文件等,这么多文件,如果编写makefile的话会更加麻烦,而使用CMake就很方便。

CMake常用的预定义变量
PROJECT_NAME : 通过 project() 指定项目名称
PROJECT_SOURCE_DIR : 工程的根目录
PROJECT_BINARY_DIR : 执行 cmake 命令的目录
CMAKE_CURRENT_SOURCE_DIR : 当前 CMakeList.txt 文件所在的目录
CMAKE_CURRENT_BINARY_DIR : 编译目录,可使用 add subdirectory 来修改
EXECUTABLE_OUTPUT_PATH : 二进制可执行文件输出位置
LIBRARY_OUTPUT_PATH : 库文件输出位置
BUILD_SHARED_LIBS : 默认的库编译方式 ( shared 或 static ) ,默认为 static
CMAKE_C_FLAGS : 设置 C 编译选项
CMAKE_CXX_FLAGS : 设置 C++ 编译选项
CMAKE_CXX_FLAGS_DEBUG : 设置编译类型 Debug 时的编译选项
CMAKE_CXX_FLAGS_RELEASE : 设置编译类型 Release 时的编译选项
CMAKE_GENERATOR : 编译器名称
CMAKE_COMMAND : CMake 可执行文件本身的全路径
CMAKE_BUILD_TYPE : 工程编译生成的版本, Debug / Release
边栏推荐
- Problems and abuse of protocol buffers
- 分布式能源的不确定性——风速测试(Matlab代码实现)
- vite3学习记录
- LU_ASR01语音模块使用
- 一道golang中关于for range常见坑的面试题
- Hezhou esp32c3 hardware configuration information serial port printout
- 模块化开发
- It's good to change jobs for a while, and it's good to change jobs all the time?
- 第三届SLAM技术论坛-吴毅红教授
- Comment présenter votre expérience de projet lors d'une entrevue
猜你喜欢
![[wechat applet] do you know about applet development?](/img/3d/da58255aeb6bf6bc5021d988906bcc.png)
[wechat applet] do you know about applet development?

Network learning infrared module, 8-way emission independent control

Jetson nano recording stepping on the pit (it will definitely solve your problem)

高数下|三重积分的计算2|高数叔|手写笔记

flink原理及开发总结(详细)

1309_ Add GPIO flip on STM32F103 and schedule test with FreeRTOS

网络学习型红外模块,8路发射独立控制

Stm32c8t6 driving lidar actual combat (II)

OOM机制

做一个有职业操守的软件匠人
随机推荐
Chapter 2 回归
LeetCode热题 HOT52-100
1061 Dating
深入浅出边缘云 | 1. 概述
基于速度、复杂性等因素比较KernelSHAP和TreeSHAP
第三届SLAM技术论坛-吴毅红教授
scala编程(初级)
SQLite database
高数下|二重积分的计算3|高数叔|手写笔记
如何在面試中介紹自己的項目經驗
Hezhou esp32c3 hardware configuration information serial port printout
Qt桌面白板工具其一(解决曲线不平滑的问题——贝塞尔曲线)
Day109.尚医通:集成Nacos、医院列表、下拉列表查询、医院上线功能、医院详情查询
Major optimization of openim - Message loading on demand, consistent cache, uniapp Publishing
Green-Tao 定理 (3): 反一致函数及其生成的 Sigma-代数
Identify some positions in the parenthesis sequence
【arxiv】第一次上传论文小记
221. Largest square ● &1277. Square submatrix with statistics all 1 ● ●
TCP半连接队列和全连接队列(史上最全)
Vrrp+mstp configuration details [Huawei ENSP experiment]