2012-02-21 14 views
14

Ho sofferto per un po 'con un problema su Qt.Errore: simbolo/i non trovato per l'architettura x86_64, collect2: ld restituito 1 stato di uscita

Ecco il mio codice:

hexbutton.h:

#ifndef HEXBUTTON_H 
#define HEXBUTTON_H 

#include <QPushButton> 
#include <QWidget> 
#include <QIcon> 

class HexButton : public QPushButton 
{ 
    Q_OBJECT 

public: 
    HexButton(QWidget *parent, QIcon &icon, int i, int j); 

public slots: 
    void changeIcon(); 
}; 

#endif // HEXBUTTON_H 

Hexbutton.cpp:

#include "hexbutton.h" 

HexButton::HexButton(QWidget *parent, QIcon &icon, int i , int j) : QPushButton(parent){ 
    //setFlat(true); 
    setIcon(icon); 
    setGeometry((i*40)+((j*40)/2), j*40, 40, 40); 
} 

void HexButton::changeIcon(){ 
     setIcon(QIcon("/Users/jonathanbibas/Documents/Workspace Qt/Test/hexagon.gif")); 
} 

MyWindow.h:

#ifndef MYWINDOW_H 
#define MYWINDOW_H 

#include <QApplication> 
#include <QWidget> 
#include <QPushButton> 
#include <QLCDNumber> 
#include <QSlider> 
#include <QProgressBar> 
#include "hexbutton.h" 



class MyWindow : public QWidget 
{ 

public: 
    MyWindow(); 
    ~MyWindow(); 

private: 
    HexButton * myButtons[11][11]; 
}; 



#endif // MYWINDOW_H 

MyWindow.cpp:

#include "MyWindow.h" 
#include <QColor> 
#include <QIcon> 


MyWindow::MyWindow() : QWidget() { 


    setFixedSize(740, 440); 

    QIcon icon = QIcon("/Users/jonathanbibas/Documents/Workspace Qt/Test/whitehexagon.png"); 

    for(int i =0 ; i < 11 ; i ++){ 
     for(int j =0 ; j < 11 ; j ++){ 


      myButtons[i][j] = new HexButton(this, icon, i, j); 

      QObject::connect(myButtons[i][j], SIGNAL(clicked()), myButtons[i][j], SLOT(changeIcon())); 
     } 
    } 
} 



MyWindow::~MyWindow() 
{ 
    delete myButtons; 

} 

E, infine, Main.cpp:

#include <QApplication> 
#include "MyWindow.h" 


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

     MyWindow fenetre; 
     fenetre.show(); 

     return app.exec(); 
} 

Solo nel caso, qui è la Test.pro

SOURCES += \ 
    Main.cpp \ 
    MyWindow.cpp \ 
    hexbutton.cpp 

HEADERS += \ 
    MyWindow.h \ 
    hexbutton.h 

e ho la 2 errori:

1) simbolo/i non trovato per l'architettura x86_64

2) collect2: l d returned 1 exit status

Si dice anche di 121 volte (11 * 11):

Object :: collegare: Nessun tale fessura QPushButton :: changeIcon() in ../Test/MyWindow.cpp:19

e sull'uscita di compilazione che dice:

18:22:15: Running build steps for project Test... 
18:22:15: Configuration unchanged, skipping qmake step. 
18:22:15: Starting: "/usr/bin/make" -w 
make: Entering directory `/Users/jonathanbibas/Documents/Workspace Qt/Test-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK__Debug' 
g++ -c -pipe -g -gdwarf-2 -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -Wall -W -DQT_GUI_LIB -DQT_CORE_LIB -I../../../QtSDK/Desktop/Qt/4.8.0/gcc/mkspecs/macx-g++ -I../Test -I../../../QtSDK/Desktop/Qt/4.8.0/gcc/lib/QtCore.framework/Versions/4/Headers -I../../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtCore -I../../../QtSDK/Desktop/Qt/4.8.0/gcc/lib/QtGui.framework/Versions/4/Headers -I../../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtGui -I../../../QtSDK/Desktop/Qt/4.8.0/gcc/include -I. -I../Test -I. -F/Users/jonathanbibas/QtSDK/Desktop/Qt/4.8.0/gcc/lib -o hexbutton.o ../Test/hexbutton.cpp 
g++ -headerpad_max_install_names -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -o Test.app/Contents/MacOS/Test Main.o MyWindow.o hexbutton.o moc_MyWindow.o -F/Users/jonathanbibas/QtSDK/Desktop/Qt/4.8.0/gcc/lib -L/Users/jonathanbibas/QtSDK/Desktop/Qt/4.8.0/gcc/lib -framework QtGui -framework QtCore 
Undefined symbols for architecture x86_64: 
    "vtable for HexButton", referenced from: 
     HexButton::HexButton(QWidget*, QIcon&, int, int)in hexbutton.o 
     HexButton::HexButton(QWidget*, QIcon&, int, int)in hexbutton.o 
    NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
make: *** [Test.app/Contents/MacOS/Test] Error 1 
make: Leaving directory `/Users/jonathanbibas/Documents/Workspace Qt/Test-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK__Debug' 
18:22:20: The process "/usr/bin/make" exited with code 2. 
Error while building project Test (target: Desktop) 
When executing build step 'Make' 

a quanto pare l'errore deriva dal Q_OBJECT (necessaria per la definizione slot), ma c'è qualcosa di sbagliato con il mio codice, non con il mio compilatore (perché ho quando gli slot sono in MainWindow, funziona bene).

Grazie per il vostro aiuto!

+0

È possibile includere l'errore completo, ovvero quali simboli non sono stati trovati per favore? – je4d

+0

Ho appena aggiunto i dettagli ... –

+0

Sai di moc? Se le classi non vengono mosse correttamente, puoi avere problemi di collegamento. Prova a costruire con qmake dalla riga di comando. –

risposta

0

Normalmente questo accade con Qt a causa del vostro sistema di compilazione - indica che non si sta compilando/collegamento nel codice generato da moc

Sono abbastanza sicuro che non c'è niente di sbagliato con il codice - quindi l'errore deve essere in qualche impostazione in qt creator, che non posso davvero aiutare con come non l'ho usato molto.

Se non lo hai già fatto, puoi provare ad aggiungere una dichiarazione di distruttore vuota esplicita a hexbutton.hpp e la definizione a hexbutton.cpp. Non dovrebbe essere necessario, ma ho sentito che questo fa la differenza su alcuni eccentrici compilatori/linker.

+0

quindi cosa dovrei fare? –

+0

Ho appena notato che l'hai etichettato qt-creator - supponendo che tu stia usando un progetto di creator standard, il sistema di build non dovrebbe essere un problema. Potrei ritirare questa risposta su questa base. – je4d

+0

Ho usato Qt Creator e un "Progetto vuoto". Grazie. –

0

Spostare lo slot changeIcon() nella classe HexButton dalla classe MyWindow.

+0

L'ho appena fatto e non cambia nulla. Perché MyWindow.h ha incluso HexButton.h. Ho appena modificato il post. Grazie. –

+0

Ok, prova a eseguire QMake da QtCreator. – Kath

+0

L'ho appena fatto, funziona. Ma non succede nulla. –

1

Ho trovato la risposta finalmente!(per chi sarà interessato)

L'errore è che non avrei dovuto estendere la classe QPushButton, per personalizzare il mio pulsante, ma piuttosto, creare la mia classe HexButton estendendo/ereditando la classe QWidget! Così facendo, dobbiamo aggiungere al pulsante un'istanza di QPushButton. Beh, poi fa:

class HexButton : public QWidget 
{ 

Q_OBJECT 

public: 
    HexButton(QWidget *parent = 0); 

public slots: 
    void changeIcon(); 

private: 
    QPushButton *button; 

    }; 
2

CONFIG -= x86_64 risolto questo problema per me

12

ottenuto lo stesso errore. Avevo uno slot privato dichiarato in un file .h, ma non lo avevo definito nel mio file cpp. Ho rimosso il mio spazio inutilizzato in entrambi i posti e lo ho compilato.

+1

Ho trovato altri 2 slot non definiti nel cpp. Quindi li ho definiti. Funziona allora !! WTF. – Robert

+0

@Robert Lol !!!! – arqam

14

Di fronte lo stesso problema

  1. errore refrence non definito per il mio segnale.
  2. Dopo aver inserito Q_OBJECT macro ... errori vtable.

Ho fatto questo e ha lavorato per me

  • Aggiunto Q_OBJECT di presentare
  • progetto Puliti
  • Ran qmake
  • Rebuild

si compila bene.

+1

Grazie, Q_OBJECT e qmake correggono questi errori. – Borzh

+0

perfetto, sempre una storia di pulizia ... – Nekfeu

3

Questo è successo a me durante l'unione del codice Qt da una piattaforma a un'altra. L'ho appena risolto, dopo molte prove ed errori, quindi lo sto postando qui poiché il mio problema era diverso. Se stai unendo nuovi file, non puoi semplicemente unire i file e il file .Pro e aspettarti che vengano visualizzati in Qt Creator per la compilazione. Nota che i tuoi nuovi file non vengono effettivamente visualizzati nell'IDE sotto le tue cartelle. Ho trascurato questo, e stavo solo guardando la struttura delle cartelle e il file .Pro. Una volta che ho aggiunto manualmente tutti i file in Qt, ha compilato bene. Ecco come ho capito questo:

  1. clic destro sul "simbolo (s) non trovato per l'architettura x86_64" vaga errore e selezionare l'uscita compilato
  2. In fondo mostrerà quale metodo (s) non riesce a trovare. Trova i file in uso e aggiungi le intestazioni e i file di classe facendo clic con il pulsante destro del mouse sulla cartella che dovrebbero essere nell'IDE e selezionando "Aggiungi file esistente"
  3. Build o Clean quindi Build
1

Questo può accadere quando si dimentica l'operatore di classe quando si definisce la propria funzione.

H File:

class Globals 
{ 
public: 
    unsigned int myFunction(); 

}; 

CPP File:

unsigned int Globals::myFunction(){return 3;} 
0

cercare di rimuovere il file pro.user e reimportare progetto con qualsiasi kit 32bit qt.

Problemi correlati