将$(shell)中的make变量定义为C中的字符串

时间:2016-01-29 16:08:05

标签: c makefile

我正在使用STM32f4系列芯片上的嵌入式应用程序的makefile编译代码。

当我这样做时:

生成文件:

DEFINES += -DGIT_HASH="test hash"

在我的main.c

const char * git_hash = GIT_HASH;

当我打印git_hash时,我得到test hash

我想做的是:

生成文件:

COMMIT_HASH = $(shell git rev-parse HEAD)
DEFINES += -DGIT_HASH=$(COMMIT_HASH)

在我的main.c

const char * git_hash = GIT_HASH;

我收到错误:

<command-line>:0:10: error: 'c1920a032c487a55b1b109d8774faf05e2ba42d0' undeclared here (not in a function)
src/run/main.c:173:25: note: in expansion of macro 'GIT_HASH'
 const char * git_hash = GIT_HASH;

我想知道为什么COMMIT_HASH的处理方式与字符串不同。任何见解都将不胜感激。

1 个答案:

答案 0 :(得分:6)

请记住,#define会导致预编译器为字符替换执行直接字符。所以在你的第一个例子中,

const char * git_hash = GIT_HASH;

变为

const char * git_hash = "test hash";

编译器很好用,因为它看到了一个文字字符串。

然而,在你的第二个例子中,它变为

const char * git_hash = c1920a032c487a55b1b109d8774faf05e2ba42d0;

现在当编译器完成它的工作时,它会看到一个变量名,而不是字符串文字,正如我想你想的那样。要解决此问题,您需要确保哈希用引号括起来。一种可能的解决方案是将Makefile更改为DEFINES += -DGIT_HASH=\"$(COMMIT_HASH)\"