编译时自动包含当前版本号
Automatically include the current version number when compiling
使用源代码时,可以使用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
相关文章:
- 成功完成TLS握手后,服务器关闭时出现错误的SSL例程:SSL3_GET_RECORD:错误的版本号
- 如何在Mac OS的发布版本中包含Qt库?
- 如何从二进制文件中获取应用程序的版本号?
- 从 qmake 运行脚本以获取内部版本号
- 比较版本号字符串
- 使用以 10.0.0 形式定义版本号的宏
- 使用 c++ API 更改 qpid 协议版本号
- Visual Studio 2017,Boost和Cmake的版本号
- Boost github版本不包含子模块
- 如何将版本号从git标签传输到CPACK生成的源软件包
- 使用 C、C++ 或 Java 以编程方式获取 Java 和 Flash 的版本号
- 将内部版本号传递给 msbuild(c++ 项目)
- 如何检查特征C 模板库的版本号
- 如何解决LDCONFIG创建带有版本号的链接
- 使用Jenkins、内部版本号和svn修订版管理程序版本
- 如何在发布版本中包含声音剪辑
- 在Visual Studio 2005中自动更新版本号(C++/C#)
- 使用 #define 和 clang 为 info.plist 创建版本号变体
- 在 VS 和 Linux 版本中包含相同的 #define
- 编译时自动包含当前版本号