2014-03-04 6 views
0

최근 연구를 완료하기 위해 최종 프로젝트 작업을 시작했습니다. 이 프로젝트에서는 QT Creator를 사용해야하는 이전 학생의 작업을 계속해야합니다. 프로젝트는 직렬 통신을 사용하여 Arducopter에서 데이터를 수신하는 데 사용되는 UI 응용 프로그램입니다. 내가 코드를 컴파일 할 때QT Creator를 사용하는 QSerialPort의 다중 정의 정의

다음과 같은 오류가 팝업 :이 있습니다

qserialport.h 
qserialportglobal.h 
qserialportinfo.h 

:

C:\Qt\Qt5.1.1\5.1.1\mingw48_32\lib\libQt5SerialPortd.a(d000044.o):-1: error: multiple definition of `QSerialPort::error(QSerialPort::SerialPortError)' 
debug\moc_qserialport.o:D:\Development\Code\QTWorkspace\build-BEP-Desktop_Qt_5_1_1_MinGW_32bit-Debug\debug\moc_qserialport.cpp:520: error: first defined here 
C:\Qt\Qt5.1.1\5.1.1\mingw48_32\lib\libQt5SerialPortd.a(d000012.o):-1: error: multiple definition of `QSerialPort::qt_metacast(char const*)' 
debug\moc_qserialport.o:D:\Development\Code\QTWorkspace\build-BEP-Desktop_Qt_5_1_1_MinGW_32bit-Debug\debug\moc_qserialport.cpp:387: error: first defined here 
C:\Qt\Qt5.1.1\5.1.1\mingw48_32\lib\libQt5SerialPortd.a(d000011.o):-1: error: multiple definition of `QSerialPort::qt_metacall(QMetaObject::Call, int, void**)' 
debug\moc_qserialport.o:D:\Development\Code\QTWorkspace\build-BEP-Desktop_Qt_5_1_1_MinGW_32bit-Debug\debug\moc_qserialport.cpp:395: error: first defined here 
collect2.exe:-1: error: error: ld returned 1 exit status 

프로젝트는 다음과 같은 헤더 파일이 아닌 .CPP 해당 파일이 포함되어 있습니다 파일들; qserialportglobal.h :

#ifndef QSERIALPORTGLOBAL_H 
#define QSERIALPORTGLOBAL_H 

#include <QtCore/qglobal.h> 

QT_BEGIN_NAMESPACE 

#ifndef QT_STATIC 
# if defined(QT_BUILD_SERIALPORT_LIB) 
# define Q_SERIALPORT_EXPORT Q_DECL_EXPORT 
# else 
# define Q_SERIALPORT_EXPORT Q_DECL_IMPORT 
# endif 
#else 
# define Q_SERIALPORT_EXPORT 
#endif 

// The macro has been available only since Qt 5.0 
#ifndef Q_DECL_OVERRIDE 
#define Q_DECL_OVERRIDE 
#endif 

QT_END_NAMESPACE 

#endif // QSERIALPORTGLOBAL_H 

qserialportinfo.h :

#ifndef QSERIALPORTINFO_H 
#define QSERIALPORTINFO_H 

#include <QtCore/qlist.h> 
#include <QtCore/qscopedpointer.h> 

#include <QtSerialPort/qserialportglobal.h> 

QT_BEGIN_NAMESPACE 

class QSerialPort; 
class QSerialPortInfoPrivate; 
class QSerialPortInfoPrivateDeleter; 

class Q_SERIALPORT_EXPORT QSerialPortInfo 
{ 
    Q_DECLARE_PRIVATE(QSerialPortInfo) 
public: 
    QSerialPortInfo(); 
    explicit QSerialPortInfo(const QSerialPort &port); 
    explicit QSerialPortInfo(const QString &name); 
    QSerialPortInfo(const QSerialPortInfo &other); 
    ~QSerialPortInfo(); 

    QSerialPortInfo& operator=(const QSerialPortInfo &other); 
    void swap(QSerialPortInfo &other); 

    QString portName() const; 
    QString systemLocation() const; 
    QString description() const; 
    QString manufacturer() const; 

    quint16 vendorIdentifier() const; 
    quint16 productIdentifier() const; 

    bool hasVendorIdentifier() const; 
    bool hasProductIdentifier() const; 

    bool isNull() const; 
    bool isBusy() const; 
    bool isValid() const; 

    static QList<qint32> standardBaudRates(); 
    static QList<QSerialPortInfo> availablePorts(); 

private: 
    QScopedPointer<QSerialPortInfoPrivate, QSerialPortInfoPrivateDeleter> d_ptr; 
}; 

inline bool QSerialPortInfo::isNull() const 
{ return !d_ptr; } 

QT_END_NAMESPACE 

#endif // QSERIALPORTINFO_H 

그리고 qserialport.h : 오류가 moc_ 파일에서 발생하는 것 설명에서 보는 바와 같이

#ifndef QSERIALPORT_H 
#define QSERIALPORT_H 

#include <QtCore/qiodevice.h> 

#include <QtSerialPort/qserialportglobal.h> 

QT_BEGIN_NAMESPACE 

class QSerialPortInfo; 
class QSerialPortPrivate; 

class Q_SERIALPORT_EXPORT QSerialPort : public QIODevice 
{ 
    Q_OBJECT 

    Q_PROPERTY(qint32 baudRate READ baudRate WRITE setBaudRate NOTIFY baudRateChanged) 
    Q_PROPERTY(DataBits dataBits READ dataBits WRITE setDataBits NOTIFY dataBitsChanged) 
    Q_PROPERTY(Parity parity READ parity WRITE setParity NOTIFY parityChanged) 
    Q_PROPERTY(StopBits stopBits READ stopBits WRITE setStopBits NOTIFY stopBitsChanged) 
    Q_PROPERTY(FlowControl flowControl READ flowControl WRITE setFlowControl NOTIFY flowControlChanged) 
    Q_PROPERTY(DataErrorPolicy dataErrorPolicy READ dataErrorPolicy WRITE setDataErrorPolicy NOTIFY dataErrorPolicyChanged) 
    Q_PROPERTY(bool dataTerminalReady READ isDataTerminalReady WRITE setDataTerminalReady NOTIFY dataTerminalReadyChanged) 
    Q_PROPERTY(bool requestToSend READ isRequestToSend WRITE setRequestToSend NOTIFY requestToSendChanged) 
    Q_PROPERTY(SerialPortError error READ error RESET clearError NOTIFY error) 
    Q_PROPERTY(bool settingsRestoredOnClose READ settingsRestoredOnClose WRITE setSettingsRestoredOnClose NOTIFY settingsRestoredOnCloseChanged) 

    Q_ENUMS(Directions Rate DataBits Parity StopBits FlowControl PinoutSignals DataErrorPolicy SerialPortError) 

public: 

    enum Direction { 
     Input = 1, 
     Output = 2, 
     AllDirections = Input | Output 
    }; 
    Q_DECLARE_FLAGS(Directions, Direction) 

    enum BaudRate { 
     Baud1200 = 1200, 
     Baud2400 = 2400, 
     Baud4800 = 4800, 
     Baud9600 = 9600, 
     Baud19200 = 19200, 
     Baud38400 = 38400, 
     Baud57600 = 57600, 
     Baud115200 = 115200, 
     UnknownBaud = -1 
    }; 

    enum DataBits { 
     Data5 = 5, 
     Data6 = 6, 
     Data7 = 7, 
     Data8 = 8, 
     UnknownDataBits = -1 
    }; 

    enum Parity { 
     NoParity = 0, 
     EvenParity = 2, 
     OddParity = 3, 
     SpaceParity = 4, 
     MarkParity = 5, 
     UnknownParity = -1 
    }; 

    enum StopBits { 
     OneStop = 1, 
     OneAndHalfStop = 3, 
     TwoStop = 2, 
     UnknownStopBits = -1 
    }; 

    enum FlowControl { 
     NoFlowControl, 
     HardwareControl, 
     SoftwareControl, 
     UnknownFlowControl = -1 
    }; 

    enum PinoutSignal { 
     NoSignal = 0x00, 
     TransmittedDataSignal = 0x01, 
     ReceivedDataSignal = 0x02, 
     DataTerminalReadySignal = 0x04, 
     DataCarrierDetectSignal = 0x08, 
     DataSetReadySignal = 0x10, 
     RingIndicatorSignal = 0x20, 
     RequestToSendSignal = 0x40, 
     ClearToSendSignal = 0x80, 
     SecondaryTransmittedDataSignal = 0x100, 
     SecondaryReceivedDataSignal = 0x200 
    }; 
    Q_DECLARE_FLAGS(PinoutSignals, PinoutSignal) 

    enum DataErrorPolicy { 
     SkipPolicy, 
     PassZeroPolicy, 
     IgnorePolicy, 
     StopReceivingPolicy, 
     UnknownPolicy = -1 
    }; 

    enum SerialPortError { 
     NoError, 
     DeviceNotFoundError, 
     PermissionError, 
     OpenError, 
     ParityError, 
     FramingError, 
     BreakConditionError, 
     WriteError, 
     ReadError, 
     ResourceError, 
     UnsupportedOperationError, 
     UnknownError 
    }; 

    explicit QSerialPort(QObject *parent = 0); 
    explicit QSerialPort(const QString &name, QObject *parent = 0); 
    explicit QSerialPort(const QSerialPortInfo &info, QObject *parent = 0); 
    virtual ~QSerialPort(); 

    void setPortName(const QString &name); 
    QString portName() const; 

    void setPort(const QSerialPortInfo &info); 

    bool open(OpenMode mode) Q_DECL_OVERRIDE; 
    void close() Q_DECL_OVERRIDE; 

    void setSettingsRestoredOnClose(bool restore); 
    bool settingsRestoredOnClose() const; 

    bool setBaudRate(qint32 baudRate, Directions dir = AllDirections); 
    qint32 baudRate(Directions dir = AllDirections) const; 

    bool setDataBits(DataBits dataBits); 
    DataBits dataBits() const; 

    bool setParity(Parity parity); 
    Parity parity() const; 

    bool setStopBits(StopBits stopBits); 
    StopBits stopBits() const; 

    bool setFlowControl(FlowControl flow); 
    FlowControl flowControl() const; 

    bool setDataTerminalReady(bool set); 
    bool isDataTerminalReady(); 

    bool setRequestToSend(bool set); 
    bool isRequestToSend(); 

    PinoutSignals pinoutSignals(); 

    bool flush(); 
    bool clear(Directions dir = AllDirections); 
    bool atEnd() const Q_DECL_OVERRIDE; 

    bool setDataErrorPolicy(DataErrorPolicy policy = IgnorePolicy); 
    DataErrorPolicy dataErrorPolicy() const; 

    SerialPortError error() const; 
    void clearError(); 

    qint64 readBufferSize() const; 
    void setReadBufferSize(qint64 size); 

    bool isSequential() const Q_DECL_OVERRIDE; 

    qint64 bytesAvailable() const Q_DECL_OVERRIDE; 
    qint64 bytesToWrite() const Q_DECL_OVERRIDE; 
    bool canReadLine() const Q_DECL_OVERRIDE; 

    bool waitForReadyRead(int msecs) Q_DECL_OVERRIDE; 
    bool waitForBytesWritten(int msecs) Q_DECL_OVERRIDE; 

    bool sendBreak(int duration = 0); 
    bool setBreakEnabled(bool set = true); 

Q_SIGNALS: 
    void baudRateChanged(qint32 baudRate, QSerialPort::Directions dir); 
    void dataBitsChanged(QSerialPort::DataBits dataBits); 
    void parityChanged(QSerialPort::Parity parity); 
    void stopBitsChanged(QSerialPort::StopBits stopBits); 
    void flowControlChanged(QSerialPort::FlowControl flow); 
    void dataErrorPolicyChanged(QSerialPort::DataErrorPolicy policy); 
    void dataTerminalReadyChanged(bool set); 
    void requestToSendChanged(bool set); 
    void error(QSerialPort::SerialPortError serialPortError); 
    void settingsRestoredOnCloseChanged(bool restore); 

protected: 
    qint64 readData(char *data, qint64 maxSize) Q_DECL_OVERRIDE; 
    qint64 readLineData(char *data, qint64 maxSize) Q_DECL_OVERRIDE; 
    qint64 writeData(const char *data, qint64 maxSize) Q_DECL_OVERRIDE; 

private: 
    void setError(QSerialPort::SerialPortError error, const QString &errorString = QString()); 

    QSerialPortPrivate * const d_ptr; 

    Q_DECLARE_PRIVATE(QSerialPort) 
    Q_DISABLE_COPY(QSerialPort) 
}; 

Q_DECLARE_OPERATORS_FOR_FLAGS(QSerialPort::Directions) 
Q_DECLARE_OPERATORS_FOR_FLAGS(QSerialPort::PinoutSignals) 

QT_END_NAMESPACE 

#endif // QSERIALPORT_H 

, 필자는이 파일에 익숙하지 않지만 일부 연구를 통해이 파일들이 있고 신호 기능이 확장되었음을 알았습니까? 오류의 다른 쪽이 표준 라이브러리에서 발견되었으므로이 파일에서 아무 것도 변경하지 않았습니다.

도움을 주시면 대단히 감사 드리며 며칠 동안 붙어 있습니다.

답변

0

이러한 헤더는 공식 Qt 라이브러리에 포함되어 있으므로 프로젝트 내부에 배치하면 안됩니다. 프로젝트에서 해당 헤더를 삭제하고 단지 Qt는에서 직접이 포함

#include <QSerialPort> 
#include <QSerialPortInfo> 

방법 MOC 작품에 대한 설명 : 그것은 특별한 QObjects에 대한 프로젝트 헤더를 검색하고 C++ 코드를 생성합니다. (MOC를 _ * CPP) 신호 + 슬롯이 작동하도록합니다. 그러나 QSerialPort에 대해 생성 된이 코드는 Qt 라이브러리에 이미 있습니다. moc이 프로젝트의 해당 헤더를 찾으면 두 번째 코드를 생성하므로 QSerialPort 함수에 대한 여러 정의가 표시됩니다.

+0

매력처럼 작동했습니다. explenation 주셔서 감사합니다! – user3380994