C++ 错误:找不到架构 x86_64 的符号,collect2:ld 返回 1 个退出状态
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9370264/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Error: symbol(s) not found for architecture x86_64, collect2: ld returned 1 exit status
提问by Jonathan Bibas
I have been struggling for a while with an issue on Qt.
我一直在为 Qt 上的问题苦苦挣扎。
Here is my code:
这是我的代码:
hexbutton.h:
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:
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:
我的窗口.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:
我的窗口.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:
最后,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
以防万一,这里是 Test.pro
SOURCES += \
Main.cpp \
MyWindow.cpp \
hexbutton.cpp
HEADERS += \
MyWindow.h \
hexbutton.h
And I get the 2 errors:
我得到了 2 个错误:
1) symbol(s) not found for architecture x86_64
1) 找不到架构 x86_64 的符号
2) collect2: ld returned 1 exit status
2) collect2: ld 返回 1 个退出状态
It also says 121 times (11*11):
它还说 121 次(11*11):
Object::connect: No such slot QPushButton::changeIcon() in ../Test/MyWindow.cpp:19
Object::connect: ../Test/MyWindow.cpp:19 中没有这样的插槽 QPushButton::changeIcon()
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).
显然错误来自 Q_OBJECT(插槽定义需要),但是我的代码有问题,而不是我的编译器(因为当插槽位于 MainWindow 时,它工作正常)。
Thank you for your help!
感谢您的帮助!
回答by TRS
Faced same problem
遇到同样的问题
- undefined refrence error for my signal.
- After putting Q_OBJECT macro... vtable errors.
- 我的信号的未定义参考误差。
- 放入 Q_OBJECT 宏后... vtable 错误。
I did this and worked for me
我这样做并为我工作
- Added Q_OBJECT to file
- Cleaned project
- Ran qmake
- Rebuild
- 将 Q_OBJECT 添加到文件
- 清理项目
- 冉qmake
- 重建
it compiles fine.
它编译得很好。
回答by Dan
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.
得到了同样的错误。我在 .h 文件中声明了一个私有插槽,但我没有在我的 cpp 文件中定义它。我在两个地方都删除了我未使用的插槽,并进行了编译。
回答by Tim
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:
我在将 Qt 代码从一个平台合并到另一个平台时发生了这种情况。我刚刚解决了它,经过多次反复试验,所以我在这里发布它,因为我的问题是不同的。如果您正在合并新文件,您不能只合并文件和 .Pro 文件,并期望它们会出现在 Qt Creator 中进行编译。请注意,您的新文件实际上并未显示在您文件夹下的 IDE 中。我忽略了这一点,只是查看文件夹结构和 .Pro 文件。一旦我在 Qt 中手动添加了所有文件,它就可以正常编译。这是我想出的方法:
- Right click on the vague "symbol(s) not found for architecture x86_64" error, and select Compiled Output
- 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"
- Build, or Clean then Build
- 右键单击含糊不清的“symbol(s) not found for architecture x86_64”错误,然后选择编译输出
- 在底部,它将显示找不到的方法。找到这些方法所在的文件,并添加这些头文件和类文件,方法是右键单击它们应该在 IDE 中的文件夹,然后选择“添加现有文件”
- 构建,或先清理再构建
回答by Bohdan Korniyenko
CONFIG -= x86_64
fixed this problem for me
CONFIG -= x86_64
为我解决了这个问题
回答by Jonathan Bibas
I found the answer finally! (for whoever will be interested)
我终于找到了答案!(对于有兴趣的人)
The mistake is that I shouldn't have extended the class QPushButton, to customize my button, but rather, create my own class HexButton extending/inheriting the QWidget class! Doing so we must add to the button, a QPushButton instance. Well it then makes:
错误是我不应该扩展类 QPushButton 来自定义我的按钮,而是创建我自己的类 HexButton 扩展/继承 QWidget 类!这样做我们必须向按钮添加一个 QPushButton 实例。那么它使:
class HexButton : public QWidget
{
Q_OBJECT
public:
HexButton(QWidget *parent = 0);
public slots:
void changeIcon();
private:
QPushButton *button;
};
回答by user1767754
This can happen, when you forgot the Class-Operator, when defining your function.
当您忘记类运算符时,在定义函数时,可能会发生这种情况。
H File:
H文件:
class Globals
{
public:
unsigned int myFunction();
};
CPP File:
CPP文件:
unsigned int Globals::myFunction(){return 3;}
回答by tolgayilmaz
try to remove pro.user file and reimport project with any qt 32bit kit.
尝试删除 pro.user 文件并使用任何 qt 32 位套件重新导入项目。
回答by je4d
Normally this happens with Qt because of your build system - it indicates that you're not compiling/linking in the code generated by moc
通常,由于您的构建系统,Qt 会发生这种情况 - 这表明您没有在由生成的代码中编译/链接 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.
我很确定你的代码没有任何问题 - 所以错误一定是在 qt creator 中的某些设置中,我真的无能为力,因为我没有经常使用它。
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.
如果您还没有,您可以尝试在 hexbutton.hpp 中添加一个明确的空析构函数声明,并在 hexbutton.cpp 中添加定义。应该没有必要,但我听说这会对一些古怪的编译器/链接器产生影响。
回答by Kath
Move the slot changeIcon() into HexButton class from MyWindow class.
将插槽 changeIcon() 从 MyWindow 类移动到 HexButton 类中。