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.ii
和 file.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 可选预处理器输出和编译一次通过的主要内容,如果未能解决你的问题,请参考以下文章