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


参数 -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 选项。目的是获取在编译项目过程中使用的每个预处理文件。

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


5063
2018-01-29 20:52


起源



答案:


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

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


3
2018-01-29 21:23



对不起,我的帖子中有一个拼写错误。我的示例中的两个文件都具有相同的扩展名。 - Customizer
是的,我知道参数-E。但问题是,模式#1“<FILE_PATH>”有多行。好吧,直到一分钟前,我想,这将是一个问题。但我认为这个模式的每一行都只是声明一个路径或包含一个带有结尾.h的头文件。所以它应该可以解析那些东西。但我还不确定,如果我可以指望的话。 - Customizer
非常感谢。在...的帮助下 gcc.gnu.org/onlinedocs/cpp/... 我应该能够解析我得到的文件 -E。 - Customizer


答案:


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

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


3
2018-01-29 21:23



对不起,我的帖子中有一个拼写错误。我的示例中的两个文件都具有相同的扩展名。 - Customizer
是的,我知道参数-E。但问题是,模式#1“<FILE_PATH>”有多行。好吧,直到一分钟前,我想,这将是一个问题。但我认为这个模式的每一行都只是声明一个路径或包含一个带有结尾.h的头文件。所以它应该可以解析那些东西。但我还不确定,如果我可以指望的话。 - Customizer
非常感谢。在...的帮助下 gcc.gnu.org/onlinedocs/cpp/... 我应该能够解析我得到的文件 -E。 - Customizer


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


8
2018-02-16 13:45