Skip to content

工程版本号

  • 为工程添加版本号,比如起步工程的版本号设置为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;
              }
          }
          
      }
    • shell
      ./Test --version
      • 打印结果:

        • shell
          Version 1.0
  • 但是这样就面临一个问题,我们每次修改版本号都需要修改源代码,有没有一种方式是不需要修改源代码的呢?

    • cmake就可以帮你实现。
  • 首先,需要在cmake中指定当前工程的版本号:

    • project(Test VERSION 1.0)
      • 这里制定的版本号是1.0
      • cmake调用project()命令时,会在幕后定义Test_VERSION_MAJORTest_VERSION_MINOR
      • 在本例中,Test_VERSION_MAJOR = 1Test_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@
      • 当调用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;
              }
          }
          
      }
  • 工程编译头文件路径:

    • 这个路径在编译/链接的过程中去寻找头文件
    • 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}")
  • 构建:

    • shell
      cd build
      cmake ..
      cmake --build .
  • 执行

    • shell
      ./Test --version
      • 打印结果:

        • shell
          Version 1.0

Released under the MIT License.