头图

CMake(二)

1、C++标准指定

CMake 有一些特殊的变量,它们有的是在底层创建的,或者是在项目代码设置时对 CMake 有意义的,其中许多变量以 CMAKE_ 开头的
在我们自己声明配置变量时,需要尽可能避免采用这种命名方式

在这些特殊的变量中,包含有2个比较常用的,CMAKE_CXX_STANDARDCMAKE_CXX_STANDARD_REQUIRED,这二者经常一同使用,来指定用来构建项目的C++标准

这里为了使用方便,直接换了“最强IDE”——Visual Studio,直接把之前的目录导入给它,它可以识别出CMake项目
在这里插入图片描述
这样省去敲命令行,比较方便
接下来修改下我们的main.cpp文件,添加一个C++17的特性

#include<iostream>

// C++17新特性
inline int globalVar = 42;

int main()
{
    std::cout << "Hello, CMake!" << std::endl;
}

接下来修改CMakeLists.txt,添加C++版本配置的内容

# 指定最低支持的CMake版本
cmake_minimum_required(VERSION 3.10)
# 指定编译使用C++标准
set(CMAKE_CXX_STANDARD 11)
# 启用支持以上指定C++标准
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 设置项目名称
project(Beginner)
# 将指定源文件编译成可执行文件
add_executable(App main.cpp)

在这里插入图片描述
这两行配置都要写在add_executable()之前
表示的意思就是我们强制指定项目使用C++11标准,此时C++17的特性注定会报错,我们保存下,回去看下刚刚的代码
在这里插入图片描述
此时编译报错了,我们回去把C++11改为C++17
在这里插入图片描述
现在程序没有报错了
在这里插入图片描述
值得注意的是,Visual Studio可以直接关联到配置的可执行文件,可以如下勾选,直接进行执行
在这里插入图片描述

2、获取CMakeLists.txt的参数

有的时候,我们也希望在 CMakelists.txt 文件中定义的变量也可以在源代码中使用,就比如我们希望在代码中打印项目的版本

其中的一种实现方式是使用配置头文件。我们创建一个输入文件,其中包含一个或多个要替换的变量。这些变量有特殊的语法,形如 @VAR@
然后,我们使用 configure_file() 命令将输入文件复制到给定的输出文件,并用 CMakelists.txt 文件中 VAR 的当前值替换这些变量

可能类似于填表,给你一张表,上面告诉你要填什么,然后最终输出的是对应填完的内容

我们来改一下CMakeLists.txt文件,添加版本号信息
在这里插入图片描述
在这里插入图片描述
project() 会根据入参在底层存储对应的值,因此通过PROJECT_VERSION或者Beginner_VERSION应该都可以引用到版本号的值

接下来,我们需要新创建一张需要填空的模板,标注需要的变量,这个文件为BeginnerConfig.h.in

#define APP_VERSION_MAJOR @Beginner_VERSION_MAJOR@
#define APP_VERSION_MINOR @Beginner_VERSION_MINOR@
#define APP_VERSION_PATCH @Beginner_VERSION_PATCH@

添加configure_file()BeginnerConfig.h.in的内容拷贝给BeginnerConfig.h,当然,此时已经有具体的内容了
在这里插入图片描述
最终生成的配置文件会在项目构建目录,因此需要使用target_include_directories()指定查找文件的位置,注意需要在生成目标文件后才可以,默认会到App.exe生成的目录下
在这里插入图片描述
接下来,我们在main.cpp中进行引用

#include<iostream>
#include "BeginnerConfig.h"   // 生成的输出文件,作为头文件

int main()
{
    std::cout << "Hello, " << APP_VERSION_MAJOR << "." << APP_VERSION_MINOR << "." << APP_VERSION_PATCH << std::endl;
    getchar();
}

此时,看下全部的CMakeLists.txt配置内容,确认一下

# 指定最低支持的CMake版本
cmake_minimum_required(VERSION 3.10)
# 指定编译使用C++标准
set(CMAKE_CXX_STANDARD 17)
# 启用支持以上指定C++标准
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 设置项目名称
project(Beginner  VERSION 1.0.0)
# 拷贝配置
configure_file(BeginnerConfig.h.in BeginnerConfig.h)
# 将指定源文件编译成可执行文件
add_executable(App main.cpp)
# 查找文件的目录
target_include_directories(App PUBLIC "${PROJECT_BINARY_DIR}")

执行后,可以看到CMakeLists.txt中配置的版本信息已经被代码成功获取到了
在这里插入图片描述
我们自己项目里现在就这几个文件
在这里插入图片描述
而获取的内容在CMake为我们生成的这个头文件中
在这里插入图片描述
Visual Studio的解决方案管理器里显示的不是全部内容,通过进入文件管理器,可以看到,BeginnerConfig.h出现在我们的可执行文件目录下,这便是我们最后包含的目录
在这里插入图片描述
通过这种方式,我们实现了从配置文件中获取参数

在实际的开发中,也是建议将版本号像这样放在配置文件中,而不是直接写在代码中,便于管理和查阅,防止代码修改


minos_chertsfield
1 声望0 粉丝

强壮的Android程序猿,热爱音乐、游戏和运动,不断充实自己和养护头发~~