我在qt c ++中开发一个应用程序,在linux上(然后是其他平台)。 我在我的项目中使用了第三部分的库。在程序执行期间,库在我的调试控制台上写入调试消息,我需要保持清理它以调试程序的其他部分。 如何仅重定向(或隐藏)此库中的调试消息,我该怎么办? 感谢
此致 安德烈
答案 0 :(得分:1)
如果你有* .so的代码,你可以尝试在发布模式下编译它,这样就可以避免编译/执行调试消息。
您仍然可以在“调试模式”项目中使用“发布模式”库。请注意,您无法从库中看到任何符号。
回应你的评论:
...我已经尝试了但是库仍然在发布版本中打印调试消息
您看到的消息似乎并非真正“调试”消息。邮件可能由cout
或printf
打印?是这样的,我担心你不能只重定向图书馆的消息。
您可以重定向进程的消息,并且在加载库时,您执行的每个函数都由加载器进程执行,因此,它将作为重定向/隐藏只是进程输出的一部分。
但是,既然你有代码,为什么不添加
#ifdef DEBUG
...
#endif
阻止你的自我?
答案 1 :(得分:0)
您可以使用qInstallMsgHandler
并创建自定义消息处理程序。
不幸的是,这种方式意味着所有qDebug消息都以相同的方式处理,无论从哪里开始。但是,它确实可以灵活地创建自己的调试消息类型并在应用程序中使用它,而共享库使用普通的qDebug类型。
这是来自Qt示例的修改代码:
#include <qapplication.h>
#include <stdio.h>
#include <stdlib.h>
const unsigned int MyMsgType = QtFatalMsg + 1;
void myMessageOutput(QtMsgType type, const char *msg)
{
switch (type) {
case QtDebugMsg:
// do nothing.
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s\n", msg);
break;
case QtCriticalMsg:
fprintf(stderr, "Critical: %s\n", msg);
break;
case QtFatalMsg:
fprintf(stderr, "Fatal: %s\n", msg);
abort();
case MyMsgType:
fprintf(stderr, "MyMsg: %s\n", msg);
break;
}
}
int main(int argc, char **argv)
{
qInstallMsgHandler(myMessageOutput);
QApplication app(argc, argv);
return app.exec();
}
在其他地方打印自定义调试消息时,请使用QDebug(MyMsgType) << "Message.";