CMake 是一个强大的构建工具,也是C/C++程序员应该必备的技能之一
官网:CMake
参考视频:CMake入门教程_哔哩哔哩_bilibili
找了好多教学资料不是基于linux就是跳跃性较大。偶然发现一个不错的好资源就学习了一波。
本文参考上面b站的教学视频,这个教学十分推荐,新手保姆级的,up也分享了自己的笔记和demo
本文针对windows x64进行讲解
C/C++环境为mingw
这里默认大家都配置好了
下载地址:Download | CMake
解压后是如下四个文件
bin目录中就5个文件,将其配置到环境变量中
cmd下快速打开系统属性
高级 —> 环境变量
将bin目录的路径添加到path中即可
sysdm.cpl
检查配置情况
在命令行中检查配置情况
出现版本号说明环境配置成功
cmake --version
官方案例:[Step 1: A Basic Starting Point — CMake 3.24.2 Documentation](https://cmake.org/cmake/help/latest/guide/tutorial/A Basic Starting Point.html)
在demo
文件夹下创建build和src
并在src
下创建main.cpp和CMakeLists.txt
虽然windows下文件一般不区分大小写,但还是建议按照官方的格式编写
main.cpp
就打印一下内容
#include
int main() {
std::cout << "Hello World" << std::endl;
std::cout << __cplusplus << std::endl;
return 0;
}
CMakeLists.txt
# 设置最低本版号
cmake_minimum_required(VERSION 3.10)
# 设置项目名称
project(demo)
# 添加可执行程序
add_executable(demo main.cpp)
由于cmake默认在执行路劲下生成文件,因此我们先转到build目录中
cd build
cmake ../src
出现这个的原因是cmake默认是以NMake Makefiles
构建的,输入cmake -help
可查看
cmake -help
而我这里的编译环境是mingw,因此可以指定编译生成方式
""
包裹有空格的字符串
cmake -G "MinGW Makefiles" ../src
如果出现了Error,则可能是刚才一次的编译文件还保留着,出现了冲突,删除后再次执行即可
会自动生成一大堆玩意
# .表示在当前目录下
cmake --build .
这样我们的第一个程序就完成了
cmake可以理解为一门语言,有变量,有函数。我们要遵守其中的规则来编程
CMakeLists.txt
# 设置最低本版号
cmake_minimum_required(VERSION 3.10)
# 项目名 版本 描述 主页 语言
project(demo LANGUAGES CXX VERSION 1.0 )
########################################
message(STATUS "######################")
# 项目名
message(${PROJECT_NAME})
# 项目资源路径
message(${PROJECT_SOURCE_DIR})
# message(${_SOURCE_DIR})
message(${demo_SOURCE_DIR})
# 二进制文件文件夹,也就是build文件夹
message(${PROJECT_BINARY_DIR})
# message(${_BINARY_DIR})
message(${demo_BINARY_DIR})
# 版本号
message(${PROJECT_VERSION})
# message(${_VERSION})
message(${demo_VERSION})
# 主版本号
message(${PROJECT_VERSION_MAJOR})
# message(${_VERSION_MAJOR})
message(${demo_VERSION_MAJOR})
# 次版本号
message(${PROJECT_VERSION_MINOR})
# message(${_VERSION_MINOR})
message(${demo_VERSION_MINOR})
message(STATUS "######################")
########################################
message(STATUS "######################")
# 定义变量
set(str "test_set")
message(${str})
# 设置C++标准
set(CMAKE_CXX_STANDARD 11)
# 设置运行时目标文件(exe、dll)的输出位置
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# 设置存档目标文件(lib、a)的输出位置
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
message(STATUS "######################")
########################################
message(STATUS "######################")
option(DATE_ENABLE "output versio" ON)
if(DATE_ENABLE)
set(DATE "2022")
endif()
configure_file(config.h.in config.h)
message(STATUS "######################")
########################################
# 添加可执行程序
add_executable(demo main.cpp)
########################################
# (所有文件) 头文件的搜索目录
# include_directories(${PROJECT_BINARY_DIR})
# (目标文件) 头文件的搜索目录
target_include_directories(demo PUBLIC
"${PROJECT_BINARY_DIR}"
)
main.cpp
#include
#include "config.h"
int main() {
std::cout << "Hello World" << std::endl;
std::cout << __cplusplus << std::endl;
std::cout << "version = " << PROJECT_VERSION_MAJOR << "."
<< PROJECT_VERSION_MINOR;
#ifdef DATE
std::cout << "DATE = " << DATE << std::endl;
#endif
return 0;
}
config.h.in
// the configured options and settings for Tutorial
#define PROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
#define PROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@
#cmakedefine DATE ${DATE}
# 项目名
message(${PROJECT_NAME})
# 项目资源路径
message(${PROJECT_SOURCE_DIR})
# message(${_SOURCE_DIR})
message(${demo_SOURCE_DIR})
# 二进制文件文件夹,也就是build文件夹
message(${PROJECT_BINARY_DIR})
# message(${_BINARY_DIR})
message(${demo_BINARY_DIR})
# 版本号
message(${PROJECT_VERSION})
# message(${_VERSION})
message(${demo_VERSION})
# 主版本号
message(${PROJECT_VERSION_MAJOR})
# message(${_VERSION_MAJOR})
message(${demo_VERSION_MAJOR})
# 次版本号
message(${PROJECT_VERSION_MINOR})
# message(${_VERSION_MINOR})
message(${demo_VERSION_MINOR})
# STATUS 前缀为--的信息
# SEND_ERROR 产生错误,跳过生成过程
# FATAL_ERROR 产生错误,终止运行
message([<mode>] "message text" ...)
cmake_minimum_required(VERSION <min>)
# 项目名 语言 C CXX
project(<PROJECT-NAME> [<language-name>...])
# 项目名 版本 描述 主页 语言
# 后面这几个的顺序没有太大关系,因为都要指明健
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[LANGUAGES <language-name>...])
可能出现的error
CMake Error at CMakeLists.txt:5 (project):
project with VERSION, DESCRIPTION or HOMEPAGE_URL must use LANGUAGES before
language names.必须指明语言,不能单独指明版本,描述,主页
set(<variable> <value>)
# 自定义变量
set(str "test_set")
# 设置C++标准
set(CMAKE_CXX_STANDARD 11)
# 设置运行时目标文件(exe、dll)的输出位置
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# 设置存档目标文件(lib、a)的输出位置
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
# value的值为 ON 或 OFF ,默认为 OFF
# 命令行 -D=ON/OFF
option(<variable> "" [value])
注意,有的时候发现没效果需要先清一下build的缓存
# 输入文件中形如 @VAR@ 或 ${VAR} 的字符串会被替换为这些变量的当前值
# 如果未定义则被替换为空字符串
configure_file(<input> <output>)
include输出后的文件需要加入该配置
target_include_directories(demo PUBLIC
"${PROJECT_BINARY_DIR}"
)
E.G.
CMakeLists.txt
option(DATE_ENABLE "output versio" ON)
if(DATE_ENABLE)
set(DATE "2022")
endif()
configure_file(config.h.in config.h)
target_include_directories(demo PUBLIC
"${PROJECT_BINARY_DIR}"
)
config.h.in
// the configured options and settings for Tutorial
#define PROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
#define PROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@
#cmakedefine DATE ${DATE}
build中生成的 config.h
// the configured options and settings for Tutorial
#define PROJECT_VERSION_MAJOR 1
#define PROJECT_VERSION_MINOR 0
#define DATE 2022
// 如果是off则DATE是
// /* #undef DATE */
若不指明则是在build的时候才报错
# 目录会被添加到当前文件的 INCLUDE_DIRECTORIES 属性中
# 当前文件的每一个目标文件的 INCLUDE_DIRECTORIES 属性也会添加该目录
include_directories(dir1 [dir2 ...])
# 目标文件有 INCLUDE_DIRECTORIES 和 INTERFACE_INCLUDE_DIRECTORIES 两个属性
# INCLUDE_DIRECTORIES 对内头文件目录
# INTERFACE_INCLUDE_DIRECTORIES 对外头文件目录
# PRIVATE 自己使用
# INTERFACE 给外部使用
# PUBLIC 内外都可以
target_include_directories(<target>
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])