例如,'uname -a'的輸出是否可用於在下面創建COMPILED_ON宏?gcc C預處理器可以使用shell命令的輸出嗎?
#include <stdio.h>
#define COMPILED_ON `call uname -a and use the output as a quoted string'
int main(int argc, char **argv) {
printf(COMPILED_ON);
return 0;
}
例如,'uname -a'的輸出是否可用於在下面創建COMPILED_ON宏?gcc C預處理器可以使用shell命令的輸出嗎?
#include <stdio.h>
#define COMPILED_ON `call uname -a and use the output as a quoted string'
int main(int argc, char **argv) {
printf(COMPILED_ON);
return 0;
}
沒有,但是:
gcc -DCOMPILED_ON="$(uname -a)"
不是這樣,沒有。
你需要做的:
gcc "-DCOMPILED_ON=\"`uname -a`\"" -c file.c -o file.o
另外,有你的makefile創建一個簡單的.h文件中:
echo "#define COMPILED_ON \"`uname -a`\"" > compiledon.h
然後#include "compiledon.h"
你需要的\"
部分爲了得到一個可用的字符串。
沒有,但你可以在一個不那麼脆弱和SCCS敵對的方式實現自己的目標。
讓make目標運行shell腳本來創建.h
文件。
有一個make變量通過shell命令設置自己並傳遞一個-D
。並非所有的make(1)
實現都支持這一點。
讓您的make target使用包含shell命令的-D運行編譯器。
我不認爲你可以用GNU預處理器做到這一點,但它確實無法用普通的標準預處理器來完成;相反,我認爲這是Makefile的工作。
讓它運行uname -a
並將其存儲在Makefile變量中,該變量將用於爲編譯器創建正確的-D
指令。
您也可以使Makefile創建一個包含宏定義的文件.h
,該文件將由需要COMPILED_ON
宏的文件生成d。這有額外的好處,獨立於編譯器特定的選項來定義宏。
請注意,這些建議也適用於構建除了良好製作之外的工具。
如果你碰巧使用CMake的我有一個很好的片段,這可能有助於一些:
# This ensures the SHA1 git ref is shown within the app
execute_process(COMMAND git rev-parse HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE GITSHA1REF)
string(REGEX REPLACE "\n$" "" GITSHA1REF "${GITSHA1REF}")
message(STATUS "GITSHA1REF = ${GITSHA1REF}")
add_definitions("-DGITSHA1REF=\"${GITSHA1REF}\"")
有了,我得到當前的Git SHA1哈希值,並使用它像這樣在我的C++代碼:
std::cout << "Git-SHA1: " << GITSHA1REF << std::endl;