gcc -E -dM给了我预处理器定义,但我希望它能够编译

时间:2011-06-16 22:34:40

标签: gcc

我有一个带有复杂Makefile结构的大型源目录(很多包含等)

我想抓住gcc将在你运行时提供的预处理器定义

gcc -E -dM。但是,我也希望构建源代码。当我检查make / build日志时,我想查看make运行的所有命令,以及来自源中传递给编译器和/或覆盖的所有文件的#defines。

我不知道该怎么做。

例如

如果文件foo.c只有这一行

#define PI 3.14

运行gcc -E -dM foo.c将打印出stdout的所有预处理定义,以及foo.c中的define。

但它没有编译。如何组合命令,以便发生这两件事?

1 个答案:

答案 0 :(得分:3)

您需要在两次传递中执行此操作,但您可以设置一个makefile规则来执行此操作,例如:用于编译C代码:

%.o: %.c
    $(CC) $(CFLAGS) -dM -E $< > $<.dump  # dump all preprocessor symbols to .dump file
    $(CC) $(CFLAGS) -c $< -o $@          # compile to .o as normal

或者,如果要分离构建和预处理,则可以有两个规则,例如

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@          # compile to .o as normal

%.dump: %.c
    $(CC) $(CFLAGS) -dM -E $< > $<.dump  # dump all preprocessor symbols to .dump file

您还需要一个假目标来确保所有.c文件生成.dump文件。