2011-02-11 35 views
8

我想在Qt中使用MinGW編譯器創建一個簡單的GUI應用程序(至今)。但是,編譯器通知我,我有一個multiple definition of 'WiimoteScouter::WiimoteScouter(QWidget*)',line 4wiimotescouter.cpp。我正在使用一個檢查來確保標題不被多次包含,但顯然它不工作,我不知道爲什麼。C++ Qt多重定義

這裏的頭文件:

#ifndef WIIMOTESCOUTER_H 
#define WIIMOTESCOUTER_H 

#include <QWidget> 

class QLabel; 
class QLineEdit; 
class QTextEdit; 

class WiimoteScouter : public QWidget 
{ 
    Q_OBJECT 

public: 
    WiimoteScouter(QWidget *parent = 0); 

private: 
    QLineEdit *eventLine; 
}; 

#endif // WIIMOTESCOUTER_H 

而這裏的cpp文件:

#include <QtGui> 
#include "wiimotescouter.h" 

WiimoteScouter::WiimoteScouter(QWidget *parent) : 
    QWidget(parent) 
{ 
    QLabel *eventLabel = new QLabel(tr("Event:")); 
    eventLine = new QLineEdit; 

    QGridLayout *mainLayout = new QGridLayout; 
    mainLayout->addWidget(eventLabel, 0, 0); 
    mainLayout->addWidget(eventLine, 0, 1); 

    setLayout(mainLayout); 
    setWindowTitle(tr("Wiimote Alliance Scouter")); 
} 

最後,main.cpp中:

#include <QtGui> 
#include "wiimotescouter.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    WiimoteScouter wiimoteScouter; 
    wiimoteScouter.show(); 

    return app.exec(); 
} 
+1

這聽起來更像是一個鏈接器錯誤,而不是編譯器錯誤。 .pro文件中是否有多個.cpp文件?發佈完整的錯誤信息也會有幫助。 – 2011-02-11 02:47:26

回答

36

我在項目(.pro或.pri)文件中複製源文件之前就已經看到過這種情況。檢查項目文件中的所有「SOURCES =」和「SOURCES + =」行,並確保cpp文件不在那裏多次。僅供參考

2

我不使用MinGW的,但這聽起來像一個鏈接器錯誤,而不是編譯器錯誤。如果是這種情況,那麼你應該檢查.CPP文件沒有被添加到項目兩次。我也注意到擴展名是「php」,這是非常不尋常的,因爲它應該是「cpp」。

0

答:

我包括

#include myclass.cpp 

代替

#include myclass.h 
0

,如果你有在不同文件夾中的兩個名稱相同的.ui文件,這也可能發生。他們相應的頭文件被構建在同一個目錄中,導致一個被覆蓋。至少這是我的問題。

0

當我的插槽聲明列在頭文件中的信號標題下列出,而不是插槽1時,我得到了此錯誤消息。對於遇到此錯誤消息的人來說,另一件事是檢查。

切割和粘貼解決了問題,並需要檢查下次我手動創建插槽。

0

對我來說,這是由於Windows中使用MinGW的Qt編譯模型。

我的代碼編譯爲Linux的完全正常的,但對於Windows的鏈接錯誤正在發生的下列文件:

Message.cpp 
Util.cpp 

首先,在.pro文件,我找不到任何類似的文件名。然後觀察敏銳地我想通了,外部谷歌的protobuf庫,我編譯以來,有它的文件夾裏面的一些庫文件命名爲:

message.cc 
util.cc 

的情況和擴展是不同的,但不知何故,它創造的混亂在Qt彙編中。我只是給這些庫文件添加了一個下劃線,並且工作正常。