web-dev-qa-db-fra.com

Erreur: symbole (s) non trouvé (s) pour l'architecture x86_64, collect2: ld a renvoyé 1 état de sortie

Je lutte depuis un moment avec un numéro sur Qt.

Voici mon code:

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;

}

Et enfin, Main.cpp:

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


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

        MyWindow fenetre;
        fenetre.show();

        return app.exec();
}

Juste au cas où, voici le Test.pro

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

HEADERS += \
    MyWindow.h \
    hexbutton.h

Et je reçois les 2 erreurs:

1) symbole (s) introuvable (s) pour l'architecture x86_64

2) collect2: ld a renvoyé 1 état de sortie

Cela dit aussi 121 fois (11 * 11):

Object :: connect: Aucun de ces emplacements QPushButton :: changeIcon () dans ../Test/MyWindow.cpp:19

et sur la sortie de compilation, il est écrit:

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'

Apparemment, l'erreur vient de Q_OBJECT (nécessaire pour la définition des slots), mais il y a un problème avec mon code, pas avec mon compilateur (parce que j'ai des slots dans MainWindow, cela fonctionne bien).

Merci de votre aide!

14
Jonathan Bibas

Face au même problème

  1. erreur de référence non définie pour mon signal.
  2. Après avoir placé la macro Q_OBJECT ... des erreurs vtable.

Je l'ai fait et a travaillé pour moi 

  • Q_OBJECT ajouté au fichier 
  • Projet nettoyé
  • Ran qmake
  • Reconstruire

ça compile bien.

15
TRS

J'ai la même erreur. J'avais un emplacement privé déclaré dans un fichier .h, mais je ne l'avais pas défini dans mon fichier cpp. J'ai supprimé mon emplacement inutilisé aux deux endroits et celui-ci a été compilé.

12
Dan

Cela m’est arrivé lors de la fusion de code Qt d’une plate-forme à une autre. Je viens de le résoudre, après de nombreux essais et erreurs, alors je le publie ici car mon problème était différent. Si vous fusionnez de nouveaux fichiers, vous ne pouvez pas simplement fusionner les fichiers et le fichier .Pro et vous attendre à ce qu'ils apparaissent dans Qt Creator pour la compilation. Notez que vos nouveaux fichiers ne sont pas réellement affichés dans le IDE sous vos dossiers. J'ai négligé cela et je ne faisais que regarder la structure des dossiers et le fichier .Pro. Une fois que j'ai ajouté manuellement tous les fichiers dans Qt, tout a été compilé correctement. Voici comment j'ai compris ceci: 

  1. Faites un clic droit sur l'erreur "symbole (s) introuvable pour l'architecture x86_64" et sélectionnez Sortie compilée
  2. En bas, il montrera quelle méthode il ne peut pas trouver. Recherchez le ou les fichiers dans lesquels se trouvent ces méthodes et ajoutez ces en-têtes et fichiers de classe en cliquant avec le bouton droit de la souris sur le dossier dans lequel ils doivent se trouver, puis en sélectionnant "Ajouter un fichier existant".
  3. Construire ou nettoyer puis construire
4
Tim

CONFIG -= x86_64 corrige ce problème pour moi

2
Bohdan Korniyenko

Cela peut se produire lorsque vous avez oublié l'opérateur de classe lors de la définition de votre fonction. 

Fichier H:

class Globals
{
public:
    unsigned int myFunction();

};

Fichier CPP:

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

J'ai trouvé la réponse enfin! (pour quiconque sera intéressé)

L'erreur est que je n'aurais pas dû étendre la classe QPushButton pour personnaliser mon bouton, mais plutôt créer ma propre classe HexButton étendant/héritant de la classe QWidget! Nous devons ajouter au bouton un QPushButton. exemple. Eh bien, il fait alors: 

 class HexButton : public QWidget
 {

 Q_OBJECT

 public:
     HexButton(QWidget *parent = 0);

 public slots:
    void changeIcon();

 private:
    QPushButton *button;

  };
1
Jonathan Bibas

Normalement, cela se produit avec Qt à cause de votre système de construction - cela indique que vous ne compilez pas/ne liez pas dans le code généré par moc

Je suis à peu près sûr qu'il n'y a rien de mal avec votre code - donc l'erreur doit être dans certains paramètres de qt creator, ce que je ne peux pas vraiment aider car je ne l'ai pas beaucoup utilisé.

Si vous ne l'avez pas déjà fait, vous pouvez essayer d'ajouter une déclaration de destructeur vide explicite à hexbutton.hpp et une définition à hexbutton.cpp. Cela ne devrait pas être nécessaire, mais j'ai entendu dire que cela faisait une différence sur certains compilateurs/linkers insolites.

0
je4d

essayez de supprimer le fichier pro.user et de réimporter le projet avec n’importe quel kit qt 32bit.

0
tolgayilmaz

Déplacez le slot changeIcon () dans la classe HexButton depuis la classe MyWindow.

0
Kath