Ошибка: символы не найдены для архитектуры x86_64, collect2: ld вернул 1 состояние выхода - PullRequest
16 голосов
/ 21 февраля 2012

Я некоторое время боролся с проблемой на 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: нет такого слота QPushButton :: changeIcon () в ../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, он работает нормально).

Спасибо за вашу помощь!

Ответы [ 9 ]

15 голосов
/ 16 апреля 2013

Столкнулся с той же проблемой

  1. неопределенная ошибка рефракции для моего сигнала.
  2. После помещения макроса Q_OBJECT ... ошибки vtable.

Я сделал это и работал на меня

  • Добавлен Q_OBJECT в файл
  • Очищенный проект
  • Ран qmake
  • Перестройка

отлично компилируется.

12 голосов
/ 26 августа 2012

Получил ту же ошибку.У меня был частный слот, объявленный в файле .h, но он не был определен в моем файле cpp.Я удалил свой неиспользуемый слот в обоих местах, и он скомпилирован.

4 голосов
/ 04 июля 2013

Это случилось со мной при слиянии кода Qt с одной платформы на другую.Я просто решил ее, после долгих проб и ошибок, поэтому я публикую ее здесь, так как моя проблема была другой.Если вы объединяете новые файлы, вы не можете просто объединить файлы и файл .Pro и ожидать, что они появятся в Qt Creator для компиляции.Обратите внимание, что ваши новые файлы фактически не отображаются в IDE под вашими папками.Я упустил это из виду и просто смотрел на структуру папок и файл .Pro.Как только я вручную добавил все файлы в Qt, он скомпилировался нормально.Вот как я понял это:

  1. Щелкните правой кнопкой мыши на неопределенной ошибке «Символ (ы) не найден для архитектуры x86_64») и выберите «Скомпилированный вывод»
  2. Внизу будетпоказать какие методы не могут быть найденыНайдите файлы, в которых находятся эти методы, и добавьте эти заголовки и файлы классов, щелкнув правой кнопкой мыши папку, в которой они должны находиться в IDE, и выбрав «Добавить существующий файл»
  3. Создать или Очистить, затем Создать
2 голосов
/ 19 апреля 2012

CONFIG -= x86_64 исправил эту проблему для меня

1 голос
/ 20 сентября 2014

Это может произойти, когда вы забыли Class-Operator, при определении вашей функции.

H Файл:

class Globals
{
public:
    unsigned int myFunction();

};

Файл CPP:

unsigned int Globals::myFunction(){return 3;}
1 голос
/ 21 февраля 2012

Я наконец нашел ответ! (для тех, кто будет заинтересован)

Ошибка в том, что я не должен был расширять класс QPushButton, чтобы настроить мою кнопку, а создать собственный класс HexButton, расширяющий / наследующий класс QWidget! Для этого мы должны добавить к кнопке экземпляр QPushButton. Ну, тогда это делает:

 class HexButton : public QWidget
 {

 Q_OBJECT

 public:
     HexButton(QWidget *parent = 0);

 public slots:
    void changeIcon();

 private:
    QPushButton *button;

  };
0 голосов
/ 09 августа 2015

попробуйте удалить файл pro.user и заново импортировать проект с помощью любого набора qt 32bit.

0 голосов
/ 21 февраля 2012

Переместите слот changeIcon () в класс HexButton из класса MyWindow.

0 голосов
/ 21 февраля 2012

Обычно это происходит с Qt из-за вашей системы сборки - это указывает на то, что вы не компилируете / не связываете код, сгенерированный moc

Я почти уверен, что в вашем коде нет ничего плохого - поэтому ошибка должна быть в какой-то настройке в qt creator, с чем я не могу помочь, так как не очень много ее использовал.

Если вы еще этого не сделали, попробуйте добавить явное пустое объявление деструктора в hexbutton.hpp и определение в hexbutton.cpp. В этом не должно быть необходимости, но я слышал, что это изменило некоторые странные компиляторы / компоновщики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...