(CMake) 从下载到构建第一个CMake应用

本文详细介绍CMake的基础使用方法,包括安装配置、基本命令介绍及实际案例演示,适合初学者快速上手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

在这里插入图片描述

第一个demo

官方案例:[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下文件一般不区分大小写,但还是建议按照官方的格式编写

在这里插入图片描述

在这里插入图片描述

基本code

main.cpp

就打印一下内容

#include <iostream>

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可以理解为一门语言,有变量,有函数。我们要遵守其中的规则来编程

总Code

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(${<PROJECT-NAME>_SOURCE_DIR})
message(${demo_SOURCE_DIR})

# 二进制文件文件夹,也就是build文件夹
message(${PROJECT_BINARY_DIR})
# message(${<PROJECT-NAME>_BINARY_DIR})
message(${demo_BINARY_DIR})

# 版本号
message(${PROJECT_VERSION})
# message(${<PROJECT-NAME>_VERSION})
message(${demo_VERSION})
# 主版本号
message(${PROJECT_VERSION_MAJOR})
# message(${<PROJECT-NAME>_VERSION_MAJOR})
message(${demo_VERSION_MAJOR})
# 次版本号
message(${PROJECT_VERSION_MINOR})
# message(${<PROJECT-NAME>_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 <iostream>

#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(${<PROJECT-NAME>_SOURCE_DIR})
message(${demo_SOURCE_DIR})

# 二进制文件文件夹,也就是build文件夹
message(${PROJECT_BINARY_DIR})
# message(${<PROJECT-NAME>_BINARY_DIR})
message(${demo_BINARY_DIR})

# 版本号
message(${PROJECT_VERSION})
# message(${<PROJECT-NAME>_VERSION})
message(${demo_VERSION})
# 主版本号
message(${PROJECT_VERSION_MAJOR})
# message(${<PROJECT-NAME>_VERSION_MAJOR})
message(${demo_VERSION_MAJOR})
# 次版本号
message(${PROJECT_VERSION_MINOR})
# message(${<PROJECT-NAME>_VERSION_MINOR})
message(${demo_VERSION_MINOR})

函数

message() 输出信息

# STATUS 前缀为--的信息
# SEND_ERROR 产生错误,跳过生成过程
# FATAL_ERROR 产生错误,终止运行
message([<mode>] "message text" ...)

cmake_minimum_required() 指定最低版本

cmake_minimum_required(VERSION <min>)

project() 设置项目名

# 项目名 语言 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() 设置

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)

option 设置一个开关(bool)

# value的值为 ON 或 OFF ,默认为 OFF
# 命令行 -D<variable>=ON/OFF
option(<variable> "<help_text>" [value])

configure_file 输入文本替换,并输出成文本

注意,有的时候发现没效果需要先清一下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 */

include_directories() 头文件所在路径(所有)

若不指明则是在build的时候才报错

# 目录会被添加到当前文件的 INCLUDE_DIRECTORIES 属性中
# 当前文件的每一个目标文件的 INCLUDE_DIRECTORIES 属性也会添加该目录
include_directories(dir1 [dir2 ...])

target_include_directories() 头文件所在路径(指定)

# 目标文件有 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...] ...])



END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天赐细莲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值