2016-11-18 70 views
0

我嘗試在Windows上使用鏈接符號的時間戳用gcc:定義符號GCC在Windows

gcc.exe -DTIMESTAMP=$(shell "C:/mingw/msys/1.0/bin/date.exe +%s") -E helloworld.c -o test.E 

但我得到的輸出:

gcc.exe: error: C:/mingw/msys/1.0/bin/date.exe +s): No such file or directory

「C:/ MinGW的/ msys/1.0/bin/date.exe + s「的命令行工作...

我在做什麼錯?

+0

我試過「gcc.exe -DTIMESTAMP = $(shell C:/mingw/msys/1.0/bin/date.exe + %% s)-E helloworld.c -o test.E」但沒有改變任何東西...給我:gcc.exe:錯誤:+%s):沒有這樣的文件或目錄 –

+0

您是否試圖從Windows控制檯運行此命令(「DOS提示符」/「命令提示符」)? –

+0

是的。我寫了一個bat文件來測試它。 –

回答

1

這裏有多種問題:

  1. $()不是有效的命令行語法,這是一個bash功能。您需要call命令或cmd /C
  2. shell不是命令,批處理文件或二進制文件。如果你有一個上面的子shell是沒有必要的。
  3. 百分號必須與另一個百分號%%

這裏進行轉義是你會怎麼做,在命令行(不PowerShell的):

REM Store the output of date.exe to a tempfile 
C:/mingw/msys/1.0/bin/date.exe +%%s > tmpfile 

REM Read the file into a variable 
set /p formatteddate=<tmpfile 

REM Invoke gcc.exe with the variable 
gcc.exe -DTIMESTAMP=%formatteddate% ... 
+0

好的。謝謝。我明白,但我沒有得到它的工作。什麼是正確的電話? –

0

所有C99編譯器(當然,更喜歡所有C編譯器) - 絕對包括GCC和Visual C++,幾乎所有可能使用的常見C編譯器都已經提供宏__DATE__ and __TIME__;你有沒有使用它們的原因?

它們展開爲字符串文字,指的是預處理器運行的日期和時間。 __DATE__擴展爲"Mmm Dd YYYY",例如"Nov 1 2016"; __TIME__擴大爲"hh:mm:ss",例如"23:59:59"

如果您想在對象文件中使用編譯時間戳,可以使用例如

const char timestamp[] = __DATE__ " " __TIME__ ; 

在您的C代碼。


當你需要跨越一個較大的項目共享的宏,在編譯器的多個調用(比如,在一個Makefile或這樣的),生成包含在所有編譯命令的頭文件。例如,

rm -f timestamp.h 
date '+#define TIMESTAMP "%Y-%m-%d %H:%M:%S"' > timestamp.h 

並將標誌-imacros timestamp.h添加到GCC選項。

+0

是的,我之前做過。但它只設置實際文件的時間。不適合整個項目。我需要一個解決方案,在每個構建中增加我的構建編號... –

+0

@ChristophP:那麼,如何增加方法?你甚至可以使用'date'+#define BUILDNUMBER%s'> buildnumber.h'(和'-imacros buildnumber。h')將其作爲十進制數(自Epoch起秒)。 –

+0

@ChristophP .:要將其存儲爲字符串,請使用'#define STRINGIFY_(x)#x','#define STRINGIFY(x)STRINGIFY_(x)'和'const char buildnumber [] = STRINGIFY(BUILDNUMBER);'。 –