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

文章目录

  • 前言
  • 下载和配置
    • 下载
    • 配置
  • 第一个demo
    • 创建基本项目结构
    • 基本code
    • 生成项目
    • 构建
  • 常用指令
    • 总Code
    • 变量
    • 函数
      • message() 输出信息
      • cmake_minimum_required() 指定最低版本
      • project() 设置项目名
      • set() 设置
      • option 设置一个开关(bool)
      • configure_file 输入文本替换,并输出成文本
      • include_directories() 头文件所在路径(所有)
      • target_include_directories() 头文件所在路径(指定)
  • END

前言

CMake 是一个强大的构建工具,也是C/C++程序员应该必备的技能之一

官网:CMake

参考视频:CMake入门教程_哔哩哔哩_bilibili

找了好多教学资料不是基于linux就是跳跃性较大。偶然发现一个不错的好资源就学习了一波。

本文参考上面b站的教学视频,这个教学十分推荐,新手保姆级的,up也分享了自己的笔记和demo

下载和配置

本文针对windows x64进行讲解

C/C++环境为mingw这里默认大家都配置好了

下载

下载地址:Download | CMake

(CMake) 从下载到构建第一个CMake应用_第1张图片

解压后是如下四个文件

(CMake) 从下载到构建第一个CMake应用_第2张图片

bin目录中就5个文件,将其配置到环境变量中

(CMake) 从下载到构建第一个CMake应用_第3张图片

配置

cmd下快速打开系统属性

高级 —> 环境变量

将bin目录的路径添加到path中即可

sysdm.cpl

(CMake) 从下载到构建第一个CMake应用_第4张图片

检查配置情况

在命令行中检查配置情况

出现版本号说明环境配置成功

cmake --version

(CMake) 从下载到构建第一个CMake应用_第5张图片

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

(CMake) 从下载到构建第一个CMake应用_第6张图片

(CMake) 从下载到构建第一个CMake应用_第7张图片

基本code

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) 从下载到构建第一个CMake应用_第8张图片

出现这个的原因是cmake默认是以NMake Makefiles构建的,输入cmake -help可查看

cmake -help

(CMake) 从下载到构建第一个CMake应用_第9张图片

而我这里的编译环境是mingw,因此可以指定编译生成方式

""包裹有空格的字符串

cmake -G "MinGW Makefiles" ../src

如果出现了Error,则可能是刚才一次的编译文件还保留着,出现了冲突,删除后再次执行即可

(CMake) 从下载到构建第一个CMake应用_第10张图片

会自动生成一大堆玩意

(CMake) 从下载到构建第一个CMake应用_第11张图片

构建

# .表示在当前目录下
cmake --build .

(CMake) 从下载到构建第一个CMake应用_第12张图片


这样我们的第一个程序就完成了

常用指令

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(${_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}

(CMake) 从下载到构建第一个CMake应用_第13张图片

变量

# 项目名
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 前缀为--的信息
# 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=ON/OFF
option(<variable> "" [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

你可能感兴趣的:(C++,linux,windows,服务器)