c++ - 错误 : symbol(s) not found for architecture x86_64, collect2:ld 返回 1 个退出状态

标签 c++ qt

我一直在为 Qt 上的一个问题苦苦挣扎。

这是我的代码:

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;

}

最后是 Main.cpp:

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


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

        MyWindow fenetre;
        fenetre.show();

        return app.exec();
}

以防万一,这里是 Test.pro

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

HEADERS += \
    MyWindow.h \
    hexbutton.h

我得到了 2 个错误:

1) 未找到架构 x86_64 的符号

2) collect2: ld 返回 1 个退出状态

它还说 121 次 (11*11):

Object::connect: ../Test/MyWindow.cpp:19 中没有这样的插槽 QPushButton::changeIcon()

并在编译输出中显示:

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'

显然错误来自 Q_OBJECT(插槽定义需要),但我的代码有问题,而不是我的编译器(因为当插槽位于 MainWindow 时,它工作正常)。

感谢您的帮助!

最佳答案

遇到同样的问题

  1. 我的信号未定义引用错误。
  2. 放置 Q_OBJECT 宏后... vtable 错误。

我这样做并为我工作

  • 将 Q_OBJECT 添加到文件中
  • 清理项目
  • 跑qmake
  • 重建

它编译得很好。

关于c++ - 错误 : symbol(s) not found for architecture x86_64, collect2:ld 返回 1 个退出状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9370264/

相关文章:

c++ - 如何使用相同的可执行文件在后台运行 3 QProcess

javascript - 从 Qt 应用程序转换为 Web 应用程序的建议

c++ - Qt,执行步骤 "Make"时出错

c++ - 在 QML 中使用自定义类中的 Q_PROPERTY

c++ - 字符串 "figured"显示为 "?gured"

c++ - 在 c++11 模式下使用 QtConcurrent::run with move only 参数

c++ - 如何为 C++ OpenCV 应用程序创建简单的交互式 GUI?

c++ - 反向offsetof/通过offset获取元素名称

c++ - 真等于1,假等于0吗?

c++ - std::bind 参数复制行为