工程版本号
为工程添加版本号,比如起步工程的版本号设置为1.0,在维护工程的过程中逐渐累加版本号。
当然,我们可以通过直接修改源文件来修改版本号,例如:
- c
#include <iostream> int main(int argc, char *argv[]) { if (argc == 1) { std::cout << "Hello World" << std::endl; } else if (argc == 2) { std::string argv_1 = argv[1]; if (argv_1 == "--version") { std::cout << " Version " << "1.0" << std::endl; } else { std::cout << "No defined command" << std::endl; } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 - shell
./Test --version
1打印结果:
- shell
Version 1.0
1
但是这样就面临一个问题,我们每次修改版本号都需要修改源代码,有没有一种方式是不需要修改源代码的呢?
- cmake就可以帮你实现。
首先,需要在cmake中指定当前工程的版本号:
project(Test VERSION 1.0)
- 这里制定的版本号是1.0。
- 当
cmake
调用project()
命令时,会在幕后
定义Test_VERSION_MAJOR和 Test_VERSION_MINOR。 - 在本例中,Test_VERSION_MAJOR = 1,Test_VERSION_MINOR = 0。
我们需要配置既可以在camke中使用的变量,也可以在源代码中使用的变量。
- 在cmake中,这种变量通过**@var@**表示。
我们需要创建一个TestConfig.h.in文件:
这个文件可以理解为注入文件,稍后我们会调用注入命令,将TestConfig.h.in中的内容注入到TestConfig.h中。
配置TestConfig.h.in文件:
#define Test_VERSION_MAJOR @Test_VERSION_MAJOR@ #define Test_VERSION_MINOR @Test_VERSION_MINOR@
1
2当调用project()的时候,@Test_VERSION_MAJOR@和@Test_VERSION_MINOR@作为幕后变量存在。
注入命令
configure_file(TestConfig.h.in TestConfig.h)
:- 将TestConfig.h.in中的内容注入到TestConfig.h头文件中,并且头文件生成在构建目录中(build)。
修改源代码(要include "TestConfig.h"):
- cpp
#include <iostream> #include "TestConfig.h" int main(int argc, char *argv[]) { if (argc == 1) { std::cout << "Hello World" << std::endl; } else if (argc == 2) { std::string argv_1 = argv[1]; if (argv_1 == "--version") { std::cout << " Version " << Test_VERSION_MAJOR << "." << Test_VERSION_MINOR << std::endl; } else { std::cout << "No defined command" << std::endl; } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
工程编译头文件路径:
- 这个路径在编译/链接的过程中去寻找头文件。
target_include_directories(Test PUBLIC "${PROJECT_BINARY_DIR}")
- 其中,
${PROJECT_BINARY_DIR}
表示项目二进制目录,也就是构建出来的可执行文件的目录,即build,因为我们注入的TestConfig.h也在build目录中。
- 其中,
完整的CMakeLists.txt:
- cmake
cmake_minimum_required(VERSION 3.10) project(Test VERSION 1.0) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) configure_file(TestConfig.h.in TestConfig.h) add_executable(Test test.cpp) target_include_directories(Test PUBLIC "${PROJECT_BINARY_DIR}")
1
2
3
4
5
6
7
8
9
10
11
12
构建:
- shell
cd build cmake .. cmake --build .
1
2
3
执行:
- shell
./Test --version
1打印结果:
- shell
Version 1.0
1