В настоящее время я переношу одну из моих программ Qt из Windows в Linux. Работая с полезным макросом Qt, мне удалось скомпилировать программу, но пока не удалось ее заставить работать.Ошибка сегментации Qt (Windows to linux)
Это программа, существующая из 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()
С Контроллером является частью моего основного приложения, вызывающее первой библиотеку (Updater), который вызывает вторую библиотеку (Communicator). В Communicator много соединений, но ничего не отличается от приложения Windows.
Я использовал LD_LIBRARY_PATH, чтобы убедиться, что загрузка библиотек прошла правильно, и использовал Qt Creator для компиляции моего приложения. Все это делается на Ubuntu 12.04 и операционной системе Windows 7.
Заранее благодарен!
Giriel
EDIT:
Спасибо за быстрый ответ, у меня были проблемы с компиляции в режиме отладки, но это теперь исправлена. Поэтому я запустил отладчик QtCreator и выяснил, где он идет не так, проблема в том, что я не вижу причины. Это код, где идет не так:
fSocket = new QUdpSocket(this);
fSocket->bind(QHostAddress::Any, 0, QUdpSocket::DontShareAddress);
connect(fSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
происходит выдаёт ошибку сегментации ВПодключение, как я говорил уже.
Проблема с несколькими версиями библиотек является правдоподобной, но я подумал, что, по крайней мере, QtCreator будет там в безопасности. Также если я проверю с ldd Я не вижу никаких проблем там.
EDIT2:
По запросу результаты отладки после добавления источников Qt в БГД (не похоже на работу в QtCreator хотя .gdbinit считывается при запуске?):
#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 является разыменованием нулевого указателя. Просто говорю. – johnathon
Отладчик может сообщить вам, какую переменную вы пытаетесь разыменовать ... –
Является '' usr/lib/i386-linux-gnu/libQtCore.so.4' из набора библиотек Qt, на которые вы ссылаетесь времени сборки или от версии Qt, установленной Ubuntu для использования установленными приложениями? – Troubadour