Ошибка сегмента при создании нового QTcpSocket - PullRequest
0 голосов
/ 07 декабря 2018

Я получаю ошибку сегментации, когда пытаюсь создать новый QTcpSocket:

QTcpSocket* socket = new QTcpSocket();

При запуске я вижу следующее:

$ ./hello 
Hello World
Segmentation fault (core dumped)

Я использую Qt5.11 в Unbuntu 17.04, и я не использую qmake.Я создал свой собственный Makefile.Я проверил и дважды проверил include и библиотеки для Qt 5.11, но не совсем уверен, что это проблема, потому что я могу скомпилировать, связать и выполнить просто отлично.

Кажется, есть 2 набора областейгде находится дистрибутив Qt, что вызвало некоторую путаницу:

$(HOME)Qt5.11.1/5.11.1/gcc_64 
/usr/include/x86_64-linux-gnu/qt5

Вот мой Makefile и код.

hello.h

#ifndef HELLO_H
#define HELLO_H

#include <QObject>
#include <QTcpSocket>

class hello : public QObject
{
    Q_OBJECT
public:
    explicit hello(QObject *parent = 0);

signals:
    int test();

public slots:

private:

private slots:

};
#endif // HELLO_H

hello.cpp

#include "hello.h"

#include <QTcpSocket>
#include <QDebug>

hello::hello(QObject *parent) :
    QObject(parent)
{
    qDebug() << "Hello World\n";
    QTcpSocket* socket = new QTcpSocket(this);
    emit test();
}

main.cpp

#include <QCoreApplication>

#include "hello.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    hello h;

    return a.exec();
}

Makefile

####### Compiler, tools and options

CC      =       g++
DEFINES =       -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_CORE_LIB
CFLAGS  =       -Wall -W -D_REENTRANT -fPIC $(DEFINES)
INCPATH =       -I. \
                -I$(HOME)/Qt5.11.1/5.11.1/gcc_64/include \
                -I$(HOME)/Qt5.11.1/5.11.1/gcc_64/include/QtCore \
                -I$(HOME)/Qt5.11.1/5.11.1/gcc_64/include/QtNetwork \
                -I$(HOME)/Qt5.11.1/5.11.1/gcc_64/mkspecs/linux-g++
LINK    =        g++
LFLAGS  =       -Wl,-O1 -Wl,-rpath,$(HOME)/Qt5.11.1/5.11.1/gcc_64/lib
LIBS    =       -L$(HOME)Qt5.11.1/5.11.1/gcc_64/lib \
                -L/usr/include/x86_64-linux-gnu/qt5/QtCore \
                -L/usr/include/x86_64-linux-gnu/qt5/QtNetwork \
                -lQt5Core -lQtNetwork
MOC     =       $(HOME)Qt5.11.1/5.11.1/gcc_64/bin/moc

####### Files

HEADERS =       hello.h
SOURCES =       hello.cpp \
                main.cpp
OBJECTS =       hello.o \
                main.o
SRCMOC  =       moc_hello.cpp
OBJMOC  =       moc_hello.o
TARGET  =       hello

####### Implicit rules

.SUFFIXES: .cpp

.cpp.o:
        $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<

####### Build rules

all: $(TARGET)

$(TARGET): $(OBJECTS) $(OBJMOC)
        $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)

moc: $(SRCMOC)

clean:
        -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(TARGET)
        -rm -f *~ core

####### Compile

hello.o: hello.cpp \
        hello.h \

main.o: main.cpp \
        hello.h \

moc_hello.o: moc_hello.cpp \
        hello.cpp \

moc_hello.cpp: hello.h

Вот вывод «ldd hello»:

anshah@anshah-linux-laptop:~/test/hello$ ldd hello
linux-vdso.so.1 =>  (0x00007fff2bff4000)
libQt5Core.so.5 => /home/anshah/Qt5.11.1/5.11.1/gcc_64/lib/libQt5Core.so.5 (0x00007f5c4b903000)
libQtNetwork.so.4 => /usr/lib/x86_64-linux-gnu/libQtNetwork.so.4 (0x00007f5c4b582000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5c4b1fa000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5c4afe3000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5c4ac1c000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5c4a9fc000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f5c4a7e0000)
libicui18n.so.56 => /home/anshah/Qt5.11.1/5.11.1/gcc_64/lib/libicui18n.so.56 (0x00007f5c4a347000)
libicuuc.so.56 => /home/anshah/Qt5.11.1/5.11.1/gcc_64/lib/libicuuc.so.56 (0x00007f5c49f8f000)
libicudata.so.56 => /home/anshah/Qt5.11.1/5.11.1/gcc_64/lib/libicudata.so.56 (0x00007f5c485ac000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5c483a8000)
libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007f5c481a4000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f5c47e90000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5c47b87000)
/lib64/ld-linux-x86-64.so.2 (0x000056357a3b1000)
libQtCore.so.4 => /usr/lib/x86_64-linux-gnu/libQtCore.so.4 (0x00007f5c47695000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f5c47422000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f5c47218000)

1 Ответ

0 голосов
/ 08 декабря 2018

Кажется, есть 2 набора областей, в которых находится дистрибутив Qt, что вызвало некоторую путаницу:

Это, скорее всего, является основной причиной вашего сбоя.Если вы компилируете исходники (файлы заголовков) из одной версии Qt, а затем во время выполнения используете другую версию, очень вероятно падение.

Однако основная причина, по-видимому,по-другому: вы используете две версии libQtCore:

libQt5Core.so.5 => /home/anshah/Qt5.11.1/5.11.1/gcc_64/lib/libQt5Core.so.5

libQtNetwork.so.4 => /usr/lib/x86_64-linux-gnu/libQtNetwork.so.4
libQtCore.so.4 => /usr/lib/x86_64-linux-gnu/libQtCore.so.4

Если эти библиотеки определяют одни и те же символы (что представляется весьма вероятным), то почти наверняка у вас будет плохойвремя из-за конфликтов символов и / или неправильного использования символа.

libQtCore.so.4, вероятно, вводится как зависимость libQtNetwork.so.4, и вы, вероятно, вообще не должны зависеть от libQtNetwork.so.4.

Ваш Makefile имеет:

-lQt5Core -lQtNetwork

Последняя запись, вероятно, должна быть -lQt5Network вместо.

...