2

我目前正在将我的一个 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() 是一个私有插槽。

4

2 回答 2

3

首先,QObject::connect调用可能是某些回调未能绑定到信号的指标(回调/信号是 Qt 机制)。这可能是由于在 Linux 上使用的 Qt 版本与在 Windows 上使用的不同。

其次,你可能想在 Qt Creator 下调试它,它是一个很好的调试工具。

在 上设置断点Communicator::init(),并找出失败的connect()调用。然后将传递给此connect()调用的参数与安装在 Ubuntu 机器上的 Qt 版本所需的参数进行比较。如果您可以在 Communicator::init()此处发布您的代码,那也很好,因此人们可以查看它并帮助您。

另一个原因可能是您正在使用一个版本的 Qt 进行编译,而安装的共享库在该框中是另一个版本......这只是一个疯狂的猜测,但值得仔细检查。

即使不是 Qt 版本问题,通过查看失败的调用来开始调查总是好的。也可能是它找不到 Windows 上存在的某些系统变量,并且正在传递一些空字符串 / NULL 字符串,其中需要一个实际的有效值。

于 2012-06-23T20:18:22.727 回答
0

我通过创建一个完整的新项目并复制每个文件自己解决了这个问题。因此,我认为错误必须存在于用户文件中。

谢谢大家的建议!

于 2012-07-01T20:15:56.457 回答