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

时间:2015-09-19 06:47:24

标签: c++ git compilation makefile version

使用源代码时,您可以使用命令this->x获取当前版本号。

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

--version

问题是,值if (argc >= 2) { if (argv[1] == "--version") { cout << "eval version v0.1-16-g74a9332"; } } 现在已硬编码到我的源代码中。如果我去其他地方更改某些内容,我每次提交时都必须增加此值(这只是要求合并冲突!)

此外,部分v0.1-16-g74a9332是当前提交的哈希。如果我在源代码中更改此值,则提交的哈希值会更改。

对我来说有没有办法,而不是将版本号硬编码到代码中,有c ++&#34;知道&#34;编译二进制文件时版本号是g74a9332吗?

2 个答案:

答案 0 :(得分:1)

在构建期间生成版本号。为此,使用全局变量的声明创建标题git revert f1c9df7d7f..fd04cfd1c3e

version.h

要使用版本字符串,请包含该标头并引用该全局变量。

为了简单起见,还要为相应的定义创建模板// add include guards extern char const * const version_string;

version.c.template

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

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

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 包括在编译和链接过程中。

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

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

由于编译器对您如何组织源代码一无所知,因此没有这样的标记。

答案 1 :(得分:0)

您必须稍微更改代码

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