我目前正在将我的一个 Qt 程序从 Windows 移植到 Linux。使用 Qt 的有用宏我设法编译了程序,但还没有成功地使它工作。
它是一个存在于 2 个库和一个主应用程序中的程序。在 Windows 上它工作正常并且没有 Windows 本地调用。但是当我运行我的应用程序时,我不断地遇到分段错误。
调试我的程序后,我得到以下结果:
#0 0x00fb098a in ?? () from /usr/lib/i386-linux-gnu/libQtCore.so.4
#1 0x00fc115d in QObject::connect(QObject const*, char const*, QObject const*, char const*, Qt::ConnectionType) () from /usr/lib/i386-linux-gnu/libQtCore.so.4
#2 0x001355d3 in Communicator::init(int) () from ~/QtWorkspace/App/Communication/libCommunication.so.1
#3 0x0013f7c3 in Updater::Updater(QWidget*) () from ~/QtWorkspace/App/Updater/libUpdater.so.1
#4 0x0806a2f9 in Controller::Controller(QObject*, int, char**) ()
#5 0x08051a26 in main ()
控制器是我的主应用程序的一部分,它调用第一个库(更新器),它调用第二个库(通信器)。在 Communicator 中发生了很多连接,但与 Windows 应用程序没有什么不同。
我使用 LD_LIBRARY_PATH 来确保库的加载正确,并使用 Qt Creator 编译我的应用程序。这一切都是在 Ubuntu 12.04 和 Windows 7 操作系统上完成的。
提前致谢 !
吉列尔
编辑:
感谢您的快速回复,我在调试模式下编译时遇到了问题,但现在已经解决了。所以我运行了 QtCreator 的调试器,发现它出了问题,问题是我没有看到原因。这是出错的代码:
fSocket = new QUdpSocket(this);
fSocket->bind(QHostAddress::Any, 0, QUdpSocket::DontShareAddress);
connect(fSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
正如我已经说过的,段错误发生在连接中。
多个版本的库的问题是一个合理的问题,但我认为至少 QtCreator 在那里是安全的。此外,如果我与ldd检查,我看不到任何问题。
编辑2:
根据请求将 Qt 源添加到 gdb 后的调试结果(尽管 .gdbinit 在启动时读取,但似乎在 QtCreator 中不起作用?):
#0 indexOfMethodRelative<8> (normalizeStringData=false, method=0x139efd "readPendingDatagrams()",
baseObject=0xbfffeff4) at kernel/qmetaobject.cpp:530
#1 QMetaObjectPrivate::indexOfSlotRelative (m=0xbfffeff4, slot=0x139efd "readPendingDatagrams()",
normalizeStringData=false) at kernel/qmetaobject.cpp:665
#2 0x00fc915d in QObject::connect (sender=0x825b2d0, signal=0x139f44 "2readyRead()", receiver=0xbffff160,
method=0x139efc "1readPendingDatagrams()", type=Qt::AutoConnection) at kernel/qobject.cpp:2592
#3 0x00137622 in Communicator::init (this=0xbffff160, timeOut=5000)
at ../../App/Communication/communicator.cpp:25
#4 0x00143dcc in Updater::Updater (this=0xbffff148, parent=0x0) at ../../App/Updater/updater.cpp:10
#5 0x0806b2ae in Controller::Controller (this=0xbffff120, parent=0x0, argc=1, argv=0xbffff2b4)
at ../../App/App/controller.cpp:4
#6 0x08054bbe in main (argc=1, argv=0xbffff2b4) at ../../App/App/main.cpp:18
也许这会有所帮助?readPendingDatagrams() 是一个私有插槽。