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

Cus*_*zer 13 c c++ compiler-construction gcc g++

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

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

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

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

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

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

qbe*_*220 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
Run Code Online (Sandbox Code Playgroud)

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


tur*_*1ng 5

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

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

  • 是的,我知道参数-E。但问题是,模式#1“&lt;FILE_PATH&gt;”有不止一行。好吧,直到一分钟前,我还以为这会是个问题。但我认为具有此模式的所有其他行要么只是声明一个路径,要么包含一个以 .h 结尾的头文件。所以应该确实可以解析这些东西。但我还不确定我是否可以指望这一点。 (2认同)