Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gcc-E-dM为我提供了预处理器定义,但我希望它能够编译_Gcc - Fatal编程技术网

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

gcc-E-dM为我提供了预处理器定义,但我希望它能够编译,gcc,Gcc,我有一个很大的源目录,有一个复杂的Makefile结构(包含很多内容等) 我想获取gcc在运行时提供的预处理器定义 gcc-E-dM。但是,我也希望构建源代码。当我检查make/build日志时,我希望看到make运行的所有命令,以及源代码中传递给编译器和/或重写的所有文件中的#defines 我不知道该怎么办 例如 如果有一个foo.c文件只有这一行 #定义PI 3.14 运行gcc-E-dmfoo.c将把所有预处理定义打印到stdout,以及foo.c中的定义 但它不编译。如何组合命令以使这

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

我想获取gcc在运行时提供的预处理器定义

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

我不知道该怎么办

例如

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

#定义PI 3.14

运行gcc-E-dmfoo.c将把所有预处理定义打印到stdout,以及foo.c中的定义


但它不编译。如何组合命令以使这两种情况都发生?

您需要在两个过程中完成此操作,但您可能可以设置一个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)-dM-E$<>$$谢谢保罗!我要试一试。在哪里创建.dump文件?我会在运行make(顶级)的cwd中找到它吗?@Rohan:它应该和.c文件在同一个目录中谢谢Paul。这在我用一个简单的foo.c文件创建的一个小示例中非常有效。我试图解决的问题稍微复杂一点。我有一个包含.c文件的文件夹,但编译成.o的工作正在另一个make文件中进行。我只尝试了您给我的解决方案的第一部分(使用-dM开关等),但规则似乎没有触发,因为现在在本例中,我不关心编译本身,因为它被处理了。我应该如何修改上述规则,使其在所有.c文件的感兴趣文件夹中运行,并给我这些符号?@Rohan:有关将生成与预处理分离的信息,请参阅上文的编辑。我想你可能得把手弄脏了,开始阅读GNU制作手册,学习制作文件等。谢谢保罗。是的,这对我来说是相当新鲜的。我完全同意你的建议。谢谢你的投入!
%.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