Ошибка: символы (символы) не найдены для архитектуры x86_64, collect2: ld возвращен 1 статус выхода
Я некоторое время боролся с проблемой 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):
Объект:: connect: нет такого слота QPushButton:: changeIcon() in../Test/MyWindow.cpp: 19
а на компиляторе выводится сообщение:
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
Столкнувшись с той же проблемой
- undefined ошибка refrence для моего сигнала.
- После установки макросов Q_OBJECT... vtable ошибок.
Я сделал это и работал у меня
- Добавлен Q_OBJECT в файл
- Очищенный проект
- Ran qmake
- Перестроить
он компилируется отлично.
Ответ 2
Получена та же ошибка. У меня был закрытый слот, объявленный в файле .h, но у меня его не было определено в моем файле cpp. Я удалил неиспользуемый слот в обоих местах и скомпилировал его.
Ответ 3
Это случилось со мной при слиянии Qt-кода с одной платформы на другую. Я просто решил это после долгих проб и ошибок, поэтому я размещаю его здесь, так как моя проблема была другой. Если вы объединяете новые файлы, вы не можете просто объединить файлы и файл .Pro и ожидать, что они появятся в Qt Creator для компиляции. Обратите внимание, что ваши новые файлы фактически не отображаются в среде IDE под вашими папками. Я забыл об этом и просто смотрел на структуру папок и файл .Pro. Как только я вручную добавил все файлы в Qt, он скомпилирован в порядке. Вот как я понял это:
- Щелкните правой кнопкой мыши по неопределенному "символу (-и), не найденному для архитектуры x86_64", и выберите "Скомпилированный вывод"
- Внизу он покажет, какие методы он не может найти. Найдите файлы, в которых находятся эти методы, и добавьте эти заголовки и файлы классов, щелкнув правой кнопкой мыши папку, в которой они должны находиться в среде IDE, и выберите "Добавить существующий файл"
- Сборка или очистка, а затем сборка
Ответ 4
CONFIG -= x86_64
исправил эту проблему для меня
Ответ 5
Наконец-то я нашел ответ! (для тех, кто будет заинтересован)
Ошибка заключается в том, что я не должен был расширять класс QPushButton, настраивать свою кнопку, а создавать собственный класс HexButton, расширяющий/наследующий класс QWidget!
Таким образом, мы должны добавить к кнопке экземпляр QPushButton.
Тогда он делает:
class HexButton : public QWidget
{
Q_OBJECT
public:
HexButton(QWidget *parent = 0);
public slots:
void changeIcon();
private:
QPushButton *button;
};
Ответ 6
Это может произойти, когда вы забыли Оператор класса при определении вашей функции.
H Файл:
class Globals
{
public:
unsigned int myFunction();
};
Файл CPP:
unsigned int Globals::myFunction(){return 3;}
Ответ 7
Обычно это происходит с Qt из-за вашей системы сборки - это означает, что вы не компилируете/не связываете код, сгенерированный с помощью moc
Я уверен, что в коде нет ничего плохого, поэтому ошибка должна быть в некоторых настройках в qt-создателе, с которыми я не могу справиться, поскольку я не использовал ее много.
Если вы еще этого не сделали, вы можете попробовать добавить явное пустое объявление деструктора в hexbutton.hpp и определение в hexbutton.cpp. Это не должно быть необходимо, но я слышал об этом, внося изменения в некоторые причудливые компиляторы/компоновщики.
Ответ 8
Переместите слот changeIcon() в класс HexButton из класса MyWindow.
Ответ 9
попробуйте удалить файл pro.user и reimport с любым комплектом qt 32bit.