链接Qwt库时Qt代码中的分段错误

mon*_*nts 6 c++ qt segmentation-fault qwt qt5

我正在尝试使用一些Qwt小部件制作Qt 5应用程序,但是当我尝试链接Qwt库时,我看到Qt代码中的分段错误.我正在使用一个非常简单的Qt程序,它只弹出一个空白窗口:

#include <QApplication>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget window;

    window.resize(250, 150);
    window.setWindowTitle("Simple example");
    window.show();

    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

这在我正常编译时工作正常.一旦我添加LIBS += -lqwt到我的.pro文件,问题就开始了.它仍然可以编译,但是当我尝试运行它时,即使没有调用Qwt代码也会出现分段错误.

回溯:

Program received signal SIGSEGV, Segmentation fault.
QList (this=0x3ea60da418 <QPrinterInfoPrivate::shared_null+24>) at ../../src/corelib/tools/qlist.h:121
121         inline QList() : d(&QListData::shared_null) { d->ref.ref(); }
(gdb) bt
#0  QList (this=0x3ea60da418 <QPrinterInfoPrivate::shared_null+24>) at ../../src/corelib/tools/qlist.h:121
#1  QPrinterInfoPrivate (name=..., this=0x3ea60da400 <QPrinterInfoPrivate::shared_null>) at painting/qprinterinfo_p.h:71
#2  __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at painting/qprinterinfo.cpp:35
#3  _GLOBAL__sub_I_qprinterinfo.cpp(void) () at painting/qprinterinfo.cpp:163
#4  0x0000003e9c20f2ea in call_init (l=<optimized out>, argc=argc@entry=1, argv=argv@entry=0x7fffffffddb8, env=env@entry=0x7fffffffddc8) at dl-init.c:82
#5  0x0000003e9c20f3d3 in call_init (env=<optimized out>, argv=<optimized out>, argc=<optimized out>, l=<optimized out>) at dl-init.c:34
#6  _dl_init (main_map=0x3e9c421168, argc=1, argv=0x7fffffffddb8, env=0x7fffffffddc8) at dl-init.c:130
#7  0x0000003e9c20122a in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,段错误发生在Qt的代码中,而无需访问代码main.cpp.造成这种情况的原因是什么,我该如何解决?

我在Fedora 20上使用Qt 5.2.0和Qwt 6.1.0,两者都来自存储库.

Ask*_*mov 1

在当前的 Fedora 23 中,您可以安装系统软件包:qwtqwt-qt5(以及-devel这些软件包)。您可能会意外地将 Qwt 链接到基于 Qt 5 的项目,并且确实会出现分段错误,因为“qwt”包适用于 Qt 4。

为了避免分段错误,您必须指定使用 Qt 5 构建的库,即构建中的 -lqwt-qt5,而不是 -lqwt。

例如在我的 .pro 文件中:

unix|win32: LIBS += -lqwt-qt5
Run Code Online (Sandbox Code Playgroud)

这解决了这个问题。