【发布时间】: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