编译时自动包含当前版本号
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")
不起作用。以上是关于编译时自动包含当前版本号的主要内容,如果未能解决你的问题,请参考以下文章
Python自动检测Chrome浏览器版本号并下载对应驱动文件[chromedriver.exe]