2011-06-16 34 views
1

我有一个复杂的Makefile结构的大源目录(包括地段等)GCC -E -dM给我的预处理器定义,但我希望它编译

我想抓住预处理定义了GCC将在您运行时提供

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

我不知道如何去做这件事。

对于如

如果有只用这一条线foo.c文件里

#define PI 3.14

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

但它不编译。我如何将命令组合起来以使这两件事情都发生?

回答

3

你需要在两遍中做到这一点,但你可以设置一个makefile规则来做到这一点,例如,编译C代码:

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

另外,如果你想构建分离和预处理,你可以有两个规则,例如

%.o: %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected]   # compile to .o as normal 

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

您还需要假目标确保所有.c文件生成使用.dump文件。

+0

谢谢保罗!我会给这个镜头。 .dump文件在哪里创建?我会从我跑过的地方(顶层)发现它吗? – Rohan 2011-06-17 16:31:36

+0

@Rohan:应该和.c文件在同一个目录 – 2011-06-17 16:33:02

+0

谢谢保罗。这对我用简单的foo.c文件创建的一个小例子非常有效。我试图解决的问题稍微复杂一些。我有一个带有.c文件的文件夹,但编译成.o的文件正在不同的make文件中处理。我只是尝试了你给我的解决方案的第一部分(用-dM开关等),但规则似乎没有触发,因为现在在这种情况下,我不关心编译本身,因为它的存在已搞定。 我应该如何修改上述规则,使其在所有.c文件的感兴趣文件夹中运行,并为我提供这些符号? – Rohan 2011-06-22 20:51:34

相关问题