c++ - 移植Qt程序(Windows到linux)段错误

标签 c++ linux qt segmentation-fault

我目前正在将我的一个 Qt 程序从 Windows 移植到 Linux。 使用 Qt 的有用宏,我成功地编译了该程序,但尚未成功使其工作。

它是一个由 2 个库和一个主应用程序组成的程序。在 Windows 上它工作正常并且没有 Windows native 调用。但是当我运行我的应用程序时,我不断地遇到段错误。

调试我的程序后,我得到以下结果:

#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 ()

Controller 是我的主应用程序的一部分,它正在调用第一个库(更新程序),而第一个库又调用第二个库(通讯器)。 在 Communicator 中会发生大量连接,但与 Windows 应用程序没有什么不同。

我使用 LD_LIBRARY_PATH 来确保库的加载正确,并使用 Qt Creator 来编译我的应用程序。这一切都是在 Ubuntu 12.04 和 Windows 7 操作系统上完成的。

提前致谢!

吉里尔

编辑:

感谢您的快速回复,我在 Debug模式下编译时遇到了问题,但现在已修复。所以我运行了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() 是一个私有(private)槽。

最佳答案

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

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

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

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

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

关于c++ - 移植Qt程序(Windows到linux)段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11172429/

相关文章:

linux - 在 bash 中重复特定的代码行

c++ - QT OpenGL 链接错误

c++ - QT 中的信号槽

c++ - 在 C++ 中,他们为什么要将 break 语句放在 switch 语句中?

python - 在执行 python 脚本之前切换用户

python - 程序结束后保持 matplotlib 图形打开

c++ - QAbstractItemModel + ModelTest::rowsInserted ASSERTion问题

c++ - 从 C++ 库代码到 C 应用程序代码 : symbol lookup error

c++ - 如何停止 OpenMP 2.0 的并行区域

C++——构建库