【问题标题】:Ported Qt program (Windows to linux) segmentation fault移植的 Qt 程序(Windows 到 linux)分段错误
【发布时间】:2026-01-10 01:55:01
【问题描述】:

我目前正在将我的一个 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,我看不出有任何问题。

EDIT2:

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

【问题讨论】:

  • 通常,在 linux 中,seg-fault 是一个空指针取消引用。只是说。
  • 调试器可能会告诉您要取消引用哪个变量...
  • usr/lib/i386-linux-gnu/libQtCore.so.4 是来自您在构建时链接的一组 Qt 库,还是来自 Ubuntu 安装的供已安装应用程序使用的 Qt 版本?
  • 如果你只使用 Qt,那么你必须进入一些编译器特定的情况。在 Linux (gdb) 上使用调试器或在 Qt Creator 中使用这个“buggy”播放图标启动它。
  • @johnathon QObject::connect 检查它的每个参数是否为空,并将打印错误而不是崩溃。

标签: c++ linux qt segmentation-fault


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的评论,我在调试模式下编译时遇到了问题,而在发布模式下则没有。但我现在已经解决了这个问题,并在我的问题中提供了一些额外的信息。
【解决方案2】:

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

感谢大家的建议!

【讨论】:

    最近更新 更多