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

Posted

技术标签:

【中文标题】编译时自动包含当前版本号【英文标题】:Automatically include the current version number when compiling 【发布时间】:2015-12-16 09:07:01 【问题描述】:

使用源码时,可以使用命令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

【问题讨论】:

我也在使用make 进行编译,因此允许包含该要求的答案,但我希望有某种编译器选项或功能。 我也对解决方案感兴趣。我通常将版本包含为分支(主要)/cmets(次要)。 @IQAndreas 您的代码中存在基本错误(以及@Oleg 的其他正确解决方案)。 argv[1] == "--version" 是两个不同的 char * 指针的比较,并且总是会失败。你需要std::string(argv[1]) == "--version" embed git describe string in c++ binary 的可能重复项 【参考方案1】:

在构建过程中生成版本号。为此,使用全局变量声明创建一个标题 version.h

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

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

为简单起见,还为相应的定义创建一个模板version.c.template

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

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

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

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

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


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

【讨论】:

【参考方案2】:

你必须稍微改变你的代码

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

【讨论】:

-DMY_VERSION -D 和变量名之间应该有空格吗? 我的 g++ (4.8.3) 没有空间。这是一个工作版本。我试过了。 I guess you are right。 Eeew...我把它读作-D -M -Y -_ -V -E -R -S -I -O -N等的简写。事实上,出于同样的原因,我对使用单个-作为“多字符”命令行参数的程序有个人仇恨。跨度> -DMY_VERSION=\"$(result)\"......等于 "#define MY_VERSION (git describe 结果)" 字符串.cpp 文件。我不明白你为什么不喜欢这个建议。 @OlegGopkolov 正如其他人已经指出的那样,if (argv[1] == "--version") 不起作用。

以上是关于编译时自动包含当前版本号的主要内容,如果未能解决你的问题,请参考以下文章

[Azure DevOps] 编译时自动修改版本号

如何利用git 号作为版本号 c++

Python自动检测Chrome浏览器版本号并下载对应驱动文件[chromedriver.exe]

如何拥有自动递增的版本号(Visual Studio)? [复制]

帆软bi数据库显示过期

如何在 Latex 中添加自动版本号?