CMake教程(3):添加版本号和头文件

2021-11-08  本文已影响0人  MemetGhini

在上一篇文章的基础上我们为可执行文件通过CMake添加版本号。首先用project命令设定项目的版本号。

project(Hello VERSION 1.0)

然后用configure_file命令把版本号传递到源代码中。该命令的作用是复制一个文件到另一个目录并替换@VAR@或者${VAR}为CMake中设定的值。我们为项目新增一个头文件叫Hello.h其内容为:

#define Hello_STR @Hello_STR@
#define Hello_VERSION_MAJOR @Hello_VERSION_MAJOR@
#define Hello_VERSION_MINOR @Hello_VERSION_MINOR@

并在CMakeLists.txt文件中设定Hello_STR的值

set(Hello_STR "\"Hello World From CMake!\"")

ps:set命令作用为为变量,缓存变量,环境变量赋值,本文中不详细探讨后面的文章中会专门讲解

调用configure_file来生成目标头文件:

configure_file(Hello.h Hello.h)

configure_file 命令:
第一个参数为输入文件目录,相对于CMAKE_CURRENT_SOURCE_DIR目录。也就是说相对于源码目录。
第二个参数为替换内容后的输出文件目录,相对于CMAKE_CURRENT_BINARY_DIR目录。也就是说相对了编译目录。

所以上面一行命令的作用为把根目录中的Hello.h里面@Hello_STR@, @Hello_VERSION_MAJOR@, @Hello_VERSION_MINOR@ 替换为具体的值并复制到build文件夹中。其中后面两项是设定project的版本号之后CMake自动生成,第一个我们用set命令设定了内容"Hello World From CMake!"
生成了头文件之后我们还需要通过target_include_directories命令把目录设到头文件搜索目录中,否则会找不到头文件。

target_include_directories(Hello PUBLIC ${PROJECT_BINARY_DIR})

target_include_directories的第一个参数为可执行文件名,必须是add_executable() 或者 add_library() 设定的名字。因此该命令必须放在add_executable()后面否则执行出错,找不到项目。可执行文件名和项目名可以不一样,target_include_directories的参数再后面的文章中详细讲解

所以完整的CMakeLists.txt文件为:

cmake_minimum_required(VERSION 3.10)
project(Hello VERSION 1.0)
set(Hello_STR "\"Hello World From CMake!\"")
configure_file(Hello.h Hello.h)
add_executable(Hello Hello.cpp)
target_include_directories(Hello PUBLIC ${PROJECT_BINARY_DIR})

此时执行cmake ..命令构建后目录结构如下:

.
├── CMakeLists.txt
├── Hello.cpp
├── Hello.h
└── build
    ├── CMakeCache.txt
    ├── CMakeFiles
    ├── Hello.h
    ├── Makefile
    └── cmake_install.cmake

细心一点的同学会发现,跟之前比这里多了一个Hello.h文件,其内容为:

#define Hello_STR "Hello World From CMake!"
#define Hello_VERSION_MAJOR 1
#define Hello_VERSION_MINOR 0

已经被CMakeLists.txt中的值替换了内容。再看看头文件是否引入成功,之前的Hello.cpp文件改为:

#include <iostream>
#include <Hello.h>

int main() 
{
    std::cout << Hello_STR << std::endl;
    std::cout << Hello_VERSION_MAJOR << std::endl;
    std::cout << Hello_VERSION_MINOR << std::endl;
    return 0;
}

备注:这里头文件用尖括号来引入,否则会从跟源文件同级目录搜索头文件,导致宏的内容跟预期不一致,是还没被替换的版。尖括号是预处理器以依赖于实现的方式搜索,通常在编译器预先指定的搜索目录中。
构建和编译后执行可执行文件,执行结果为:

> cmake ..
> make
> ./Hello
Hello World From CMake!
1
0
上一篇 下一篇

猜你喜欢

热点阅读