GCC 可选预处理器输出和编译一次通过

Posted

技术标签:

【中文标题】GCC 可选预处理器输出和编译一次通过【英文标题】:GCC optional preprocessor output and compilation in one pass 【发布时间】:2016-02-21 14:29:17 【问题描述】:

GCC 的预处理器选项“-H”打印用于 STDERR 的每个头文件的名称。是否可以将此输出转发到文件,而不是让它打印到 STDERR,并让 GCC 一步继续编译?

类似:

gcc -H=file.h -c file.cc

我知道我可以使用 SHELL 技巧来过滤掉这个“-H”输出,但我想避免这种情况。

我只想将“-H”输出写入文件而不是 STDERR。我不在乎这个输出是否出于某种原因必须与其他输出混合/交错,只要“-H”-输出没有污染 STDERR 并且正常的编译/链接警告/错误仍然被打印到 STDERR .

虽然 GCC 的开发者选项“-save-temps”将整个预处理器输出保存到文件中,但它不会将“-H”输出与它一起保存。

【问题讨论】:

any_command 2>file_to_redirect_stderr_to 我特别说过我想避免这样的解决方案。我的构建系统无法处理这样的 SHELL 命令。 我在 gcc 的手册页中找不到任何内容。你检查 gcc 的手册页了吗?这应该是一个权威来源。解释为什么您的构建系统“无法处理”重定向。 查看所有内容,GCC 的联机帮助页、*** 等。第一个:建议的解决方案将“-H”输出和编译错误都重定向到文件。依赖 STDERR 报告构建错误的构建系统将无法详细说明它们。第二:关注点分离。 GCC 不能独立于构建环境来处理这个问题,就像使用什么 SHELL 变体一样,就像它使用选项 -save-temps 一样?第三:我们的构建系统是外包的。我无法控制它。它也在不断变化。 SHELL 变体也可能会发生变化,因为我们现在使用不灵活的 csh。 如果其他人需要将“-H”输出转发到文件并仍然保留要打印到 STDERR 的编译错误,我想出了这个 csh 解决方案:any_command |& awk ' if(/^\./ || /^Multiple include guards/ || /^\//)print > "file_to_redirect_h_option_output_to" else print > "/dev/stderr"' 【参考方案1】:
g++ -save-temps -c file.cc

GCC 的开发者选项“-save-temps”不依赖于 SHELL 技巧,也不会产生多余的 STDERR 输出。相反,GCC 选项会生成两个文件(file.iifile.s),其中file.ii 包含预处理器输出。

在稍后阶段,例如,独立于构建系统/过程,此file.ii 可以转换为类似于“-H”输出的内容。在 csh SHELL 中,您可以使用以下命令(或类似命令)来实现此转换:

cat file.ii | grep '^# ' | awk 'a=$0;gsub(/"/,"",a);split(a,b);if(/\" 1/)split(c,d," ");c=d[1]". ";print c b[3]if(/\" 2/)split(c,d,". ");c=d[1]" "' > file.h

【讨论】:

【参考方案2】:

    围绕 gcc 编写一个小包装器来做你想做的事,而不是 shell 技巧。

    GCC 是开源软件。如果缺少某些内容,请随时添加。

【讨论】:

以上是关于GCC 可选预处理器输出和编译一次通过的主要内容,如果未能解决你的问题,请参考以下文章

gcc常用的参数说明

gcc -E xx.c

27软件包管理

gcc 编译 hello.c 的四个阶段

编译汇编链接加载

gcc 参数