在上一篇文章的基础上我们为可执行文件通过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
网友评论