【问题标题】:gcc with parameters "-S -save-temps" puts intermediate files in current directory带有参数“-S -save-temps”的 gcc 将中间文件放在当前目录中
【发布时间】:2011-01-11 00:38:31
【问题描述】:

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

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

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

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

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

您有什么想法吗,即使应该出现上述示例,我如何才能获得每个预处理文件?

【问题讨论】:

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


    【解决方案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.*

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 抱歉,我的帖子中有错字。我的示例中的两个文件具有相同的扩展名。
      • 是的,我知道参数-E。但问题是,模式#1“”不止一行。好吧,直到一分钟前,我还以为这会是个问题。但我认为这种模式的每一行要么只是声明一个路径,要么包含一个以 .h 结尾的头文件。所以应该真的可以解析那些东西。但我还不确定,我是否可以指望这一点。
      • 非常感谢。在gcc.gnu.org/onlinedocs/cpp/… 的帮助下,我应该能够解析使用-E 获得的文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      相关资源
      最近更新 更多