Error: symbol(s) not found for architecture x86_64

2020-02-01 07:21发布

I have been struggling for a while with an issue on Qt.

Here is my 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;

}

And finally, Main.cpp:

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


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

        MyWindow fenetre;
        fenetre.show();

        return app.exec();
}

Just in case, here is the Test.pro

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

HEADERS += \
    MyWindow.h \
    hexbutton.h

And I get the 2 errors:

1) symbol(s) not found for architecture x86_64

2) collect2: ld returned 1 exit status

It also says 121 times (11*11):

Object::connect: No such slot QPushButton::changeIcon() in ../Test/MyWindow.cpp:19

and on the compile output it says:

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'

Apparently the error comes from the Q_OBJECT (needed for the slots definition), but there is something wrong with my code, not with my compiler (because I have when slots are in MainWindow, it works fine).

Thank you for your help!

标签: c++ qt
9条回答
Anthone
2楼-- · 2020-02-01 07:21

Got the same error. I had a private slot declared in a .h file, but I didn't have it defined in my cpp file. I removed my unused slot in both places, and it compiled.

查看更多
孤傲高冷的网名
3楼-- · 2020-02-01 07:26

This happened to me when merging Qt code from one platform to another. I just resolved it, after much trial and error, so I'm posting it here since my issue was different. If you are merging new files, you can't just merge the files and the .Pro file and expect that they'll show up in Qt Creator for compilation. Notice your new files aren't actually being displayed in the IDE under your folders. I overlooked this, and was just looking at the folder structure and .Pro file. Once I manually added all of the files in Qt, it compiled fine. Here is how I figured this out:

  1. Right click on the vague "symbol(s) not found for architecture x86_64" error, and select Compiled Output
  2. At the bottom it will show what method(s) it can't find. Find what file(s) those methods are in, and add those headers and class files, by right clicking the folder they should be in the IDE, and selecting "Add Existing File"
  3. Build, or Clean then Build
查看更多
Fickle 薄情
4楼-- · 2020-02-01 07:29

try to remove pro.user file and reimport project with any qt 32bit kit.

查看更多
贪生不怕死
5楼-- · 2020-02-01 07:31

Normally this happens with Qt because of your build system - it indicates that you're not compiling/linking in the code generated by moc

I'm pretty sure that there's nothing wrong with your code - so the error must be in some setting in qt creator, which I can't really help with as I've not used it much.

If you haven't already, you could try adding an explicit empty destructor declaration to hexbutton.hpp and definition to hexbutton.cpp. It shouldn't be necessary, but I've heard of this making a difference on some quirky compilers/linkers.

查看更多
▲ chillily
6楼-- · 2020-02-01 07:34

This can happen, when you forgot the Class-Operator, when defining your function.

H File:

class Globals
{
public:
    unsigned int myFunction();

};

CPP File:

unsigned int Globals::myFunction(){return 3;}
查看更多
ゆ 、 Hurt°
7楼-- · 2020-02-01 07:37

CONFIG -= x86_64 fixed this problem for me

查看更多
登录 后发表回答