2011-05-12 73 views
2

我有一组使用gcc和make编译的C文件。构建过程正常工作。 我想知道如果我可以在编译期间获得一个包含所有源代码但没有任何预处理器宏的C文件。编译多个源文件时创建一个C文件

+2

为什么你需要这个?你想要解决什么实际问题? – 2011-05-12 11:03:40

+0

我正在尝试为C构建一个特定用途的静态分析器。因此,我想收集一个文件中的所有源以简化对具有多个文件的复杂项目的分析。 – 2011-05-15 07:38:44

回答

1

如果包括在gcc编译器中的所有文件一次,你可以使用

gcc -E main.c other.c another.c 

这也将包括可能使用stdlib函数-nostdinc

+0

-E选项正常工作。非常感谢 ! – 2011-05-15 07:35:40

0

你不能 - 通常你会调用编译器来编译一个源文件,产生一个目标文件。稍后,您将调用所有目标文件的链接器来创建可执行文件 - 它没有可用的原始C源代码。

但是,您可以创建一个单独的shell脚本,该脚本用于调用gcc的-E选项仅用于预处理源文件,然后使用cat实用工具将所有源放入单个文件中。

+2

使用gcc'-E'选项只执行文件的预处理 – CodeButcher 2011-05-12 08:25:18

+0

@CodeButcher:谢谢,更新了我的答案。 – 2011-05-12 08:27:12

0

您可以使用-save-temps选项来获取中间输出。但是,它将是每个源文件的一个输出文件。每个源文件分别编译并表示一个不能混合的编译单元。
您也可以使用-E选项,但只能运行预处理器而不能继续编译。

2

一个简单的做法是制作一个包含所有其他源文件的文件。

$cat *.c > metafile.c 

这将构建一个这样的文件,这取决于你如何设置你“编译一次”和IFNDEF的这个文件很可能无法编译自身。

在另一方面,如果你想在一个文件中,所有的预处理器宏的已展开和评估,那么答案是添加以下的gcc什么:

-save-temps

然后将该文件。②将包含展开和评估宏

+0

+1,但应该是'> metafile.c',而不是'> metafile.cpp' – 2011-05-12 09:24:00