在 g++ 中使用 -pass-exit-codes 时出现意外的退出状态

Posted

技术标签:

【中文标题】在 g++ 中使用 -pass-exit-codes 时出现意外的退出状态【英文标题】:Unexpected exit status when using -pass-exit-codes in g++ 【发布时间】:2016-01-20 00:36:10 【问题描述】:

执行以下操作时,编译失败的退出代码为 1,但是,基于this,我希望它是 >=3。为什么是这样?如果我想要比二进制成功/失败更详细的退出代码该怎么办?

> echo "int main() fail" > fail.cpp
> g++ -pass-exit-codes fail.cpp -o fail
fail.cpp: In function ‘int main()’:
fail.cpp:1: error: ‘fail’ was not declared in this scope
fail.cpp:1: error: expected ';' before ‘’ token
> echo $?
1
> g++ --version
g++ (GCC) 4.1.3 20080704 (Red Hat 4.1.2-27)

谢谢。

【问题讨论】:

【参考方案1】:

您指向的文档属于 gcc 版本 3.3.6。但是,在 >=4 版本中,该编译器标志的文档已更改,现在仅声明:

-pass-exit-codes 通常,如果编译器的任何阶段返回不成功的返回码,gcc 程序就会以 1 的代码退出。如果您指定 -pass-exit-codes,gcc 程序会返回任何返回错误的阶段产生的数值最高的错误 指示。如果遇到内部编译器错误,C、C++ 和 Fortran 前端将返回 4。

阅读时有点混乱。它没有指定在 3.x 的文档中很好地解释的错误代码。那么,在 gcc/g++ 4.x 版本中,可能不再生成您要查找的退出代码。

【讨论】:

有道理。那么问题是版本> = 4的退出代码是什么?在任何地方都没有找到它们,也想不出办法来引发除 1 之外的退出代码(我认为这一定是“无法编译源文件”)。 不幸的是,除了退出代码 4(内部编译器错误)之外,似乎没有文档。如果您遵循 gcc 4.8.2 源代码(在 gcc/system.h 中)中定义(和覆盖)的错误代码,则唯一定义的错误代码是 0、1 和 4,所以我想就差不多了。 我希望区分内部 g++ 错误和源代码错误,特别是,我需要识别以下错误:fatal_error (input_location, "had to relocate PCH"); (gcc/gcc-common.c)。根据我对代码的快速浏览,fatal 的退出代码为 1,是否正确? 我认为你是对的。最后,看起来您可能对退出代码不走运,为了您的目标,您将不得不解析编译器文本输出。你的问题很有趣!我赞成它,因为它让我更仔细地看待那个编译器选项!

以上是关于在 g++ 中使用 -pass-exit-codes 时出现意外的退出状态的主要内容,如果未能解决你的问题,请参考以下文章

如何在 c++ Autotools 项目中使用不同版本的 g++ 进行编译

使用 g++ 在终端中运行 .cpp 文件时出错

g++:在嵌入式应用程序中使用单例

如何在 Visual Studio 中使用 g++ 编译器

在 grails 服务中使用 g.render

为啥我需要在 g++ 中使用 typedef typename 而不是 VS?