编译时自动包含当前版本号

Automatically include the current version number when compiling

本文关键字:版本号 包含当 编译      更新时间:2023-10-16

使用源代码时,可以使用git describe命令获取当前版本号

在使用二进制文件时,我添加了一个选项,允许用户传入--version标志以获得当前版本号:

if (argc >= 2) {
    if (argv[1] == "--version") {
        cout << "eval version v0.1-16-g74a9332";
    }
}

问题是,值v0.1-16-g74a9332现在硬编码到我的源代码。如果我离开并在其他地方更改了一些东西,我将不得不在每次提交时增加这个值(这只是要求合并冲突!)

此外,g74a9332部分是当前提交的哈希值。如果我在源代码中改变这个值,提交的哈希值也会改变。

是否有任何方法让我,而不是硬编码版本号到代码中,有c++"知道"版本号是v0.1-16-g74a9332时,它编译二进制文件?

在构建过程中生成版本号。为此,创建一个头文件version.h,声明一个全局变量:

// add include guards
extern char const * const version_string;

要使用版本字符串,必须包含该头文件并引用该全局变量。

为了保持简单,还为相应的定义创建一个模板,version.c.template:

char const * const version_string =
  "v0.1-COMMIT";

然后,在你的makefile中添加一个规则来构建相应的源代码文件,将变量定义中的string替换为实际的提交号:

COMMIT := $(shell git rev-parse --short HEAD)
.PHONY: version.c
version.c: version.c.template
    sed -e "s/COMMIT/$(COMMIT)/g" version.c.template > version.c

version.c纳入编译和链接过程。

当然,您可以在构建期间将其扩展到生成大量信息。

(我在手机上,因此没有测试上面的代码)


由于编译器不知道你如何组织你的源代码,所以没有这样的标志

你必须稍微修改一下你的代码

if (argc >= 2) {
    if (std::string(argv[1]) == "--version") {
        cout << MY_VERSION;
    }
}
那么,你的Makefile必须是:
result=$(shell git describe)
all:
    g++ -DMY_VERSION="$(result)" -o main main.cpp
clean:
    rm -f main