如何将git describe命令的结果嵌入到我的c ++二进制文件中,以便我可以在运行时访问它。
我知道我可以做这样的事情
g++ -DVERSION_NUMBER=2345
然后在我的代码中我可以做到:
std::cout << VERSION_NUMBER << std::endl;
这很好,但如果版本号的值是一个字符串,例如git describe命令的输出,则无效。
有没有办法做这样的事情?
感谢。
答案 0 :(得分:4)
我想做同样的事情。通过使用GNU Make的“shell”命令,我能够使-D
标志正常工作:
生成文件:
VERSION=\"$(shell git describe)\"
CFLAGS=-DVERSION_NUMBER=$(VERSION) # etc
然后在代码中我可以引用VERSION_NUMBER
定义而没有任何问题,例如
test.c的:
printf("Version string: %s\n", VERSION_NUMBER);
答案 1 :(得分:2)
mercurial wiki包含如何使用make收集此信息的不同可能性。
答案 2 :(得分:2)
如果您使用automake,则可以使用以下内容。我已经使用它很长一段时间了,它可以很好地实现你的要求。
在Makefile.am
:
BUILT_SOURCES = git_info.h
EXTRA_DIST = echo_git_info.sh win_config.h
.
.
(main build recipes)
.
.
git_info.h: $(HEADERS) $(SOURCES)
echo_git_info.sh > git_info.h
在echo_git_info.sh
:
#! /bin/sh
function echo_git_info {
if [[ $(which git 2> /dev/null) ]]
then
local STATUS
STATUS=$(git status 2>/dev/null)
if [[ -z $STATUS ]]
then
return
fi
echo "`git symbolic-ref HEAD 2> /dev/null | cut -b 12-`-`git log --pretty=format:\"%h\" -1`, "
return
fi
}
echo "// Auto-generated source/build information."
echo "#define GIT_SOURCE_DESC \"`echo_git_info``date`\""
以上结果将导致在GIT_SOURCE_DESC
文件中定义变量git_info.h
。因此,在您的main.cpp
中,您可以:
#include <iostream>
#include "ginkgo_info.h"
int main(int argc, char* argv[]) {
std::cout << "Source is: " << $GIT_SOURCE_DESC << std::endl;
}
答案 3 :(得分:0)
这可能不是最好的,而是一种方式。您可以将字符串或其他任何内容写入二进制文件的末尾。实现此目标的一个教程是:http://edn.embarcadero.com/article/27979
但代码不是c ++。但是,您可以将示例移植到c ++。