【问题标题】:Why does my code compile with -fno-exceptions in Qt Creator when I try to use exceptions?当我尝试使用异常时,为什么我的代码在 Qt Creator 中使用 -fno-exceptions 进行编译?
【发布时间】:2012-01-10 12:05:32
【问题描述】:

在我指定的项目 .pro 文件中:

QMAKE_CXXFLAGS += -fno-exceptions  

但我可以在我的应用程序中抛出异常。对此有什么想法吗?

示例:这不应该有效,但它有效

#include <QApplication>
#include <QtDebug>

int main(int c, char**v)
{
    QApplication app(c,v);
    try
    {
        throw 1;
    }
    catch(int i)
    {

    }
    return app.exec();
}

【问题讨论】:

  • Qt 库不使用异常。
  • 有什么问题?问题是“为什么我的代码编译,我预计它会失败,因为我错误地尝试在我尝试使用 -fno-exceptions 编译的代码中抛出异常?”?或者是一个问题,“我如何正确地将我的异常使用代码与 Qt 链接起来?”? “对此有任何想法”对于 SO 来说过于宽泛,这里不是为了调查人们对给定文本的个人反应;-)
  • @smallB “我能够抛出异常”是指它们已正确调度(catch 正在工作,堆栈展开正在发生等),或者您能够编译并崩溃您的应用程序?
  • @AzzA 是的,我可以使用它们

标签: c++ qt


【解决方案1】:

您不会通过设置QMAKE_CXXFLAGS 来关闭异常,因为此选项由CONFIG 处理。你应该使用

CONFIG-=exceptions

关闭它们。

当您既没有 QMAKE_CXXFLAGS 也没有 CONFIG 设置更改时,请查看 g++ 参数:

g++ -c -O2 -frtti -fexceptions -mthreads -Wall <...> main.cpp

现在,让我们设置QMAKE_CXXFLAGS:获取

g++ -c -fno-exceptions -O2 -frtti -fexceptions -mthreads -Wall <...> main.cpp

糟糕,我们的-fno-exceptionsCONFIG-fexceptions 覆盖。 现在,让我们设置CONFIG

g++ -c -O2 -frtti -Wall -fno-exceptions <...> main.cpp
mingw32-make.exe[1]: Leaving directory `G:/proj/ingeritance'
main.cpp: In function 'int qMain(int, char**)':
main.cpp:22:15: error: exception handling disabled, use -fexceptions to enable
mingw32-make.exe[1]: *** [release/main.o] Error 1
mingw32-make.exe: *** [release] Error 2

哦!编译错误!

【讨论】:

    【解决方案2】:

    我对这个问题有点困惑。

    如果您有(或链接到)抛出异常的代码,您不能通过使用-fno-exceptions 构建代码来神奇地使它们消失。该标志会影响支持trycatch 所需的代码的生成,而不是实际引发异常的代码。

    详情请参阅GCC documentation。文档说:

    总之,有效的带有异常处理的 C++ 代码被转换成没有异常处理的方言。

    因此,似乎编译器或多或少会导致异常处理(和抛出)代码“消失”,而不是检测其使用并标记错误。后者似乎是您所期望的,但这种期望完全是错误的。

    【讨论】:

    【解决方案3】:

    尝试同时使用以下两个

    QMAKE_CFLAGS_RELEASE -= -fno-exceptions
    
    QMAKE_CXXFLAGS_RELEASE -= -fno-exceptions
    

    【讨论】:

      猜你喜欢
      • 2018-02-06
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      相关资源
      最近更新 更多