현재 Qt 프로그램 중 하나를 Windows에서 Linux로 이식하는 중입니다. Qt의 유용한 매크로로 작업하기 나는 프로그램을 컴파일 할 수 있었지만 아직 작동시키지 못했습니다.이식 된 Qt 프로그램 (Windows에서 Linux로) 세분화 오류
2 개의 라이브러리와 기본 응용 프로그램 중 하나 인 기존 프로그램입니다. Windows에서 제대로 작동하고 Windows 호출이 없습니다. 그러나 응용 프로그램을 실행할 때 세그먼트 오류가 계속 발생합니다. 컨트롤러는 두 번째 라이브러리 (커뮤니케이터)를 호출 첫 번째 라이브러리 (Updater를) 호출 내 주요 응용 프로그램의 일원으로
#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를 사용하여 응용 프로그램을 컴파일했습니다. 이 모든 작업은 우분투 12.04 및 Windows 7 운영 체제에서 수행됩니다.
미리 감사드립니다.
Giriel
편집 : 빠른 응답
덕분에, 내가 디버그 모드에서 컴파일 문제를 가지고 있지만 지금은 고정입니다. 그래서 QtCreator의 디버거를 실행하고 어디에 잘못되었는지 알았습니다. 문제는 제가 이유를 보지 못합니다.
fSocket = new QUdpSocket(this);
fSocket->bind(QHostAddress::Any, 0, QUdpSocket::DontShareAddress);
connect(fSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
이미 언급 한 바와 같이 세그먼트 폴트가 연결에서 발생 : 이는 잘못 코드입니다.
라이브러리의 여러 버전에서 문제는 그럴듯한 것이지만 적어도 QtCreator는 안전하다고 생각했습니다. 또한 ldd으로 확인해도 문제가없는 것 같습니다.
EDIT2 : 요청에 따라
GDB에 Qt는 소스를 추가 한 후 디버그 결과 (.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는 null 포인터 참조 해제입니다. 그냥 말해. – johnathon
디버거가 어떤 변수를 역 참조하려고하는지 알 수있을 것입니다 ... –
링크하고있는 Qt 라이브러리 세트에서'usr/lib/i386-linux-gnu/libQtCore.so.4'입니다. 빌드 시간이나 설치된 응용 프로그램에서 사용하기 위해 Ubuntu에서 설치 한 Qt 버전입니까? – Troubadour