2011-07-12 44 views
4

如何將git describe命令的結果嵌入到我的C++二進制文件中,以便我可以在運行時訪問它。嵌入git描述C++二進制字符串

我知道我可以做這樣的事情

g++ -DVERSION_NUMBER=2345 

然後在我的代碼我可以這樣做:

std::cout << VERSION_NUMBER << std::endl; 

這是偉大的,但如果版本號的值將無法正常工作一個字符串,例如git describe命令的輸出。

那麼有辦法做這樣的事情嗎?

謝謝。

+0

是否'G ++ -DVERSION_NUMBER = 「\'git的描述\'」'不行? –

+0

@Karl Bielefeldt不,不。 -D本質上定義了一個宏。一個宏可以計算出一個數值,但如果它包含一個字符串,則gcc會嘗試將該字符串解釋爲代碼,這顯然不起作用。 – anio

+2

我明白了,引號正在被shell刪除。它適用於我,如果我逃避引號,如'g ++ -DVERSION_NUMBER =「\」\'git describe \'\「」' –

回答

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; 
} 
+0

我不使用自動make,但我可以將其工作到我自己的make文件。不是我正在尋找的東西,但它會起作用。謝謝! – anio

0

這可能不是最好的,但一種方式。您可以將字符串或其他任何內容寫入二進制文件的末尾。一個教程實現這一點是:http://edn.embarcadero.com/article/27979

雖然代碼不是C++。但是,您可以將示例移植到C++。

4

我想做同樣的事情。我能夠通過使用GNU製作的「殼」命令這樣得到-D標誌工作得很好:

的Makefile:

VERSION=\"$(shell git describe)\" 
CFLAGS=-DVERSION_NUMBER=$(VERSION) # etc 

然後在代碼中,我可以引用VERSION_NUMBER沒有問題定義,例如

test.c的:

printf("Version string: %s\n", VERSION_NUMBER); 
+1

正如@KarlBielefeldt上面所說,如果shell禮貌地爲您移除第一組,您可能需要添加轉義引號。 –