如何將git describe命令的結果嵌入到我的C++二進制文件中,以便我可以在運行時訪問它。嵌入git描述C++二進制字符串
我知道我可以做這樣的事情
g++ -DVERSION_NUMBER=2345
然後在我的代碼我可以這樣做:
std::cout << VERSION_NUMBER << std::endl;
這是偉大的,但如果版本號的值將無法正常工作一個字符串,例如git describe命令的輸出。
那麼有辦法做這樣的事情嗎?
謝謝。
如何將git describe命令的結果嵌入到我的C++二進制文件中,以便我可以在運行時訪問它。嵌入git描述C++二進制字符串
我知道我可以做這樣的事情
g++ -DVERSION_NUMBER=2345
然後在我的代碼我可以這樣做:
std::cout << VERSION_NUMBER << std::endl;
這是偉大的,但如果版本號的值將無法正常工作一個字符串,例如git describe命令的輸出。
那麼有辦法做這樣的事情嗎?
謝謝。
如果您使用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;
}
我不使用自動make,但我可以將其工作到我自己的make文件。不是我正在尋找的東西,但它會起作用。謝謝! – anio
這可能不是最好的,但一種方式。您可以將字符串或其他任何內容寫入二進制文件的末尾。一個教程實現這一點是:http://edn.embarcadero.com/article/27979
雖然代碼不是C++。但是,您可以將示例移植到C++。
mercurial wiki包含不同的可能性如何使用make收集此信息。
我想做同樣的事情。我能夠通過使用GNU製作的「殼」命令這樣得到-D
標誌工作得很好:
的Makefile:
VERSION=\"$(shell git describe)\"
CFLAGS=-DVERSION_NUMBER=$(VERSION) # etc
然後在代碼中,我可以引用VERSION_NUMBER
沒有問題定義,例如
test.c的:
printf("Version string: %s\n", VERSION_NUMBER);
正如@KarlBielefeldt上面所說,如果shell禮貌地爲您移除第一組,您可能需要添加轉義引號。 –
是否'G ++ -DVERSION_NUMBER = 「\'git的描述\'」'不行? –
@Karl Bielefeldt不,不。 -D本質上定義了一個宏。一個宏可以計算出一個數值,但如果它包含一個字符串,則gcc會嘗試將該字符串解釋爲代碼,這顯然不起作用。 – anio
我明白了,引號正在被shell刪除。它適用於我,如果我逃避引號,如'g ++ -DVERSION_NUMBER =「\」\'git describe \'\「」' –