CMake(二)
1、C++标准指定
CMake 有一些特殊的变量,它们有的是在底层创建的,或者是在项目代码设置时对 CMake 有意义的,其中许多变量以 CMAKE_
开头的
在我们自己声明配置变量时,需要尽可能避免采用这种命名方式
在这些特殊的变量中,包含有2个比较常用的,CMAKE_CXX_STANDARD
和CMAKE_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
出现在我们的可执行文件目录下,这便是我们最后包含的目录
通过这种方式,我们实现了从配置文件中获取参数
在实际的开发中,也是建议将版本号像这样放在配置文件中,而不是直接写在代码中,便于管理和查阅,防止代码修改
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。