带参数“-S -save-temps”的gcc将中间文件放在当前目录中

时间:2010-01-29 20:52:27

标签: c++ c gcc compiler-construction g++

参数-S -save-temps可以正常工作,只要我不在具有相同名称的文件上使用它们。

考虑以下情况:我有一个带有主目录和名称为subDir的子目录的项目,并且在这两个目录中都放置了名为file.c的文件。如果我现在调用gcc -S -save-temps file.cpp subDir/file.c,则只会生成一个名为file.i的中间文件。

这是预期的行为,正如gcc的man文件告诉我的那样,当使用-save-temps时,中间文件将始终放在当前路径中。

我的问题是,我正在研究我事先不知道的项目。很有可能,有人在他的Makefiles中构建了上面提到的例子。在那种情况下,我会被卡住,因为我需要两个中间文件。

我正在构建的系统的一些文字(为了更好地理解):我的工具使用make --just-print来收集调用,项目的make文件调用。我扫描这些调用以进行编译器调用,并添加-save-temps-S选项。目的是获取在编译项目过程中使用的每个预处理文件。

你是否有任何想法,即使上面提到的例子应该出现,我怎么能得到每个预处理的文件?

2 个答案:

答案 0 :(得分:9)

在gcc 4.5中,使用-o选项时可以使用“-save-temps = obj”选项。这会将中间文件保存在与输出文件相同的目录中,这有助于防止在使用不同的源和输出目录具有相同文件名时出现问题。

gcc -save-temps=obj -c dir1/foo.c -o dir1/foo.o
gcc -save-temps=obj -c dir2/foo.c -o dir2/foo.o

中间文件将保存为dir1/foo.*dir2/foo.*

答案 1 :(得分:3)

file.cpp / file.c在不同目录中没有问题。 GCC会根据文件的扩展名创建*.ii*.i

如果它们都有c || cpp,您可以使用-E并只接收一个*.i,您可以在其中搜索pragma # 1 "<FILE_PATH>"并通过脚本提取它。