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

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

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

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

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

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

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

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

如果它们都有c || cpp,你可以使用-E并只接收一个*.i ,你可以在其中搜索编译指示# 1 ""并通过脚本解压缩。

在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.*