Qt 应用程序中显示的错误 - 如何在 Release 中不显示它们
Posted
技术标签:
【中文标题】Qt 应用程序中显示的错误 - 如何在 Release 中不显示它们【英文标题】:Errors showing in Qt application - how to not display them in Release 【发布时间】:2014-09-22 21:29:50 【问题描述】:一个 Qt 项目给出了一些错误——我实际上并没有考虑到我认为的错误:
一些例子:
Fontconfig error: "/etc/fonts/conf.d/65-khmer.conf", line 32: out of memory
// ?
QGraphicsItem::ungrabMouse: not a mouse grabber
// i think happens when the mouse grab didn't quite happen, user moved too fast...
其他几个
第一个似乎在这里有答案https://askubuntu.com/questions/421891/fontconfig-error-out-of-memory
所以我无法通过软件修复它,用户必须修复它......因为它取决于系统......
即使是内置版本,这些错误仍然会显示在命令行上...由于它们不会导致应用程序异常,我认为用户不应该看到它们。
如何在不显示这些错误的情况下构建/部署应用程序?
理想情况下,部署的应用程序当然不会出现错误,但我不知道如何处理这些类型的错误...
【问题讨论】:
假设错误被打印到stderr
:freopen( "/dev/null", "w", stderr );
应该可以解决问题。显然,您需要一些其他方法来在 Windows 上获取空设备。更便携的方式可能是***.com/questions/4954140/… 中的代码,但我不知道是否使用 Qt 消息基础结构打印了 fonconfig 错误。
因为它是一个 GUI 应用程序,Windows 用户不太可能看到这些错误......但我不明白在哪里放置 "freopen("/dev/null", "w", 标准错误);"命令?
我没有看到这些错误的打印位置,它们不是 qDebug 输出
对于 Windows:是的,但是当您尝试将流重定向到不存在的文件时可能会遇到更多错误。放置位置:在您的main
中,在其他任何事情发生之前。
能否请您作为答案发布,以便我接受,谢谢
【参考方案1】:
可以在使用后重定向流(在本例中为 stderr
)
freopen("/dev/null", "w", stderr);
只需在任何其他代码运行之前将其放在您的main
中,您应该会很好。请记住,这可能需要在 Windows 上进行更多工作。
如果错误消息是通过 Qt 消息基础结构(qDebug
等)发布的,您可以通过函数 qInstallMsgHandler 设置新的消息处理程序。
【讨论】:
@Thalia 不要忘记还有一个#if !defined(NDEBUG)
,这样您仍然可以在调试版本中获得输出。
哦,我在 pro 文件中添加了定义 - unix:CONFIG(release):DEFINES += NO_RELEASE_ERRORS... 虽然使用 NODEBUG 可能会更好?
@Thalia NDEBUG
是一种用于指示调试模式的标准定义,也被 <assert.h>
a.k.a. std::assert
认可。
试过... #if !defined(Q_OS_WIN32) && !defined(NDEBUG) 但这似乎在 DEBUG 或 RELEASE 中都是正确的,也许并非所有编译器都定义相同的符号?
@Thalia 这在很大程度上取决于您的构建系统,而 cmets 不是解决问题的正确位置。以上是关于Qt 应用程序中显示的错误 - 如何在 Release 中不显示它们的主要内容,如果未能解决你的问题,请参考以下文章
使用静态 Qt 构建在 Linux 上部署 Qt5 应用程序