【问题标题】:Are all official Qt binaries built with -no-exceptions?所有官方 Qt 二进制文件都是用 -no-exceptions 构建的吗?
【发布时间】:2015-09-20 00:15:42
【问题描述】:

如果我写

try {
    throw std::exception("Exception");
} catch (std::exception& ex) {
    qDebug("Game Over");
}

在我的主函数内(或其他任何地方),我的 Qt 应用程序崩溃了。 Exception handling doesn't work with Qt on Windows 已经描述了这种效果(5 年前)。

原始发布者显然通过自己重新配置和重建 Qt SDK(明确启用-exceptions)解决了这个问题,但我很难相信所有 Qt 二进制文件都关闭了异常,并且每个使用异常的人都必须这样做这个。

谁能指出我记录在案的地方,告诉我这是真的还是我在这里做错了什么?

我现在使用的是带有 MSVC2013、Win 7 的 Qt 5.4.2(从 here 下载了 qt-opensource-windows-x86-msvc2013_opengl-5.4.2.exe)。

【问题讨论】:

  • 这甚至不应该编译,std::exception 没有接受 const char* 参数的构造函数。 std::exception 仅用作实际异常的基类。尝试例如throw std::runtime_error("Exception"); 代替。
  • @BaummitAugen 我明白了。我没有得到任何构建错误。那告诉我什么?此外,我需要捕获的不是这个特定的异常,而是第 3 方库抛出的异常。有什么想法吗?
  • “这告诉我什么?” 显然,您的标准库实现提供了非标准功能。 “对此有任何想法吗?” 不,我无法回答这个问题,我从未使用过 QT。以上只是旧约的评论,并不意味着答案。这就是为什么我将其发布为评论而不是答案。 :)
  • @BaummitAugen 这是一个 MSVC 扩展。

标签: c++ qt exception


【解决方案1】:

你没有做错任何事。由于 Qt 不使用异常,因此在默认 Qt 构建中启用它们是不必要的开销。因此,在允许禁用异常的平台上,它们实际上会被禁用。

一般来说,你确实需要自己编译Qt。预构建的二进制文件非常适合探索和学生使用,但如果您认真在产品中使用它,或者您需要非默认配置,则绝对必须使用您需要的标志自己编译它。

【讨论】:

  • 但是这不应该在他们的二进制版本中明确指出吗?是否有网站描述用于已发布二进制文件的编译器和配置选项?
  • @virt 也许发布的二进制文件带有配置点文件?我不记得他们是否这样做,但请检查是否有任何名称以点开头的文件。如果有,其中之一应该是传递给原始构建中使用的configure 的保留配置。二进制版本有点用词不当,恕我直言,因为产品是源存储库,而不是二进制文件。
猜你喜欢
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多