QT C++新手问题:collect2:ld returned 1 exit status
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT C++新手问题:collect2:ld returned 1 exit status相关的知识,希望对你有一定的参考价值。
紧接着http://zhidao.baidu.com/question/114595927.html的,我在Linux下把QT和GCC安装好了,可是编译后显示collect2:ld returned 1 exit status,就连编译最简单的程序都这样(附图),这是为什么?
/usr/bin/ld: cannot find -lgthread-2.0
collect2: ld returned 1 exit status
make: *** [MyConX] Error 1
make: Leaving directory `/home/boihu/CPP/MyConX'
Exited with code 2.
Error while building project MyConX
When executing build step 'Make'
底下不是4栏么?
你要看那个“compile” 那栏里面有具体的事怎么个链接错误
你现在这个是“build issue”,看不到具体的
你把“ compile”的具体内容拷上来,我才知道怎么告诉你
---------------------------------------------------------
打开你项目文件下底下的Makefile文件,找到CFLAG:开头的这行,删除 "-lgthread-2.0",就可以了
或者干脆查找“-lgthread-2.0”,删除即可本回答被提问者采纳
错误:未找到架构 x86_64 的符号,collect2:ld 返回 1 退出状态
【中文标题】错误:未找到架构 x86_64 的符号,collect2:ld 返回 1 退出状态【英文标题】:Error: symbol(s) not found for architecture x86_64, collect2: ld returned 1 exit status 【发布时间】:2012-02-21 00:00:14 【问题描述】:我一直在为 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 时,它工作正常)。
感谢您的帮助!
【问题讨论】:
您能否包含完整的错误,即未找到哪些符号? 你知道moc吗?如果类没有正确地移动,您可能会遇到链接问题。尝试从命令行使用 qmake 构建。 我添加了有关该错误的更多详细信息。但我不知道moc。如果你说错误来自链接器,我会使用它。 我在弄乱 Qt+OpenCV 时也遇到了这个问题,一个未定义但声明的插槽也是我的问题,就像乔纳森的一样。很容易错过,因为插槽代码是通过设计器中的鼠标单击生成的。谢谢,乔纳森的解决方案。 (我还不能投票。) @JonathanBibas,我刚刚在使用 Qt Creator 时遇到了同样的问题,在 MyWindow.cpp 末尾添加 #include "MyWindow.moc" 解决了它,这对你有用吗? 【参考方案1】:遇到同样的问题
-
我的信号未定义参考错误。
放置 Q_OBJECT 宏后... vtable 错误。
我这样做并为我工作
将 Q_OBJECT 添加到文件中 清理项目 跑qmake 重建它编译得很好。
【讨论】:
【参考方案2】:遇到同样的错误。我在 .h 文件中声明了一个私有插槽,但我没有在我的 cpp 文件中定义它。我在两个地方都删除了我未使用的插槽,并编译了它。
【讨论】:
我发现其他 2 个插槽未在 cpp 中定义。所以我定义了它们。然后就可以了!! WTF。【参考方案3】:当我将 Qt 代码从一个平台合并到另一个平台时,这发生在我身上。经过多次试验和错误,我刚刚解决了它,所以我在这里发布它,因为我的问题不同。如果您正在合并新文件,您不能只合并文件和 .Pro 文件并期望它们会显示在 Qt Creator 中进行编译。请注意,您的新文件实际上并未显示在 IDE 中您的文件夹下。我忽略了这一点,只是在查看文件夹结构和 .Pro 文件。一旦我在 Qt 中手动添加了所有文件,它就可以正常编译。这是我的想法:
-
右键单击模糊的“symbol(s) not found for architecture x86_64”错误,然后选择 Compiled Output
在底部它会显示它找不到的方法。找到这些方法所在的文件,并添加这些头文件和类文件,方法是右键单击它们应该在 IDE 中的文件夹,然后选择“添加现有文件”
构建,或清理然后构建
【讨论】:
【参考方案4】:CONFIG -= x86_64
为我解决了这个问题
【讨论】:
你把那个放在哪里了?【参考方案5】:当你忘记了类操作符,定义你的函数时,就会发生这种情况。
H 文件:
class Globals
public:
unsigned int myFunction();
;
CPP 文件:
unsigned int Globals::myFunction()return 3;
【讨论】:
【参考方案6】:我终于找到了答案! (谁有兴趣)
错误是我不应该扩展类 QPushButton 来自定义我的按钮,而是创建我自己的类 HexButton 扩展/继承 QWidget 类! 这样做我们必须向按钮添加一个 QPushButton 实例。 那么它使:
class HexButton : public QWidget
Q_OBJECT
public:
HexButton(QWidget *parent = 0);
public slots:
void changeIcon();
private:
QPushButton *button;
;
【讨论】:
【参考方案7】:将槽 changeIcon() 从 MyWindow 类移到 HexButton 类中。
【讨论】:
我刚刚做了,并没有改变任何东西。因为 MyWindow.h 包含 HexButton.h。我刚刚编辑了帖子。谢谢。 好的,尝试从 QtCreator 运行 QMake。 我刚刚做了,它运行了。但什么也没发生。 好吧,有时候项目在“不合适”的地方就建不起来。对于我来说,“不正确”的地方是 C 盘,只要我把它移到 D 上,一切就开始工作了。试试这个。但是我从错误消息中可以看出,可能项目配置不正确......让我想更多...... 好吧,你可以试着把它移到某个地方。由于某种原因,它与 Qt 文件夹冲突。【参考方案8】:由于您的构建系统,Qt 通常会发生这种情况 - 这表明您没有在 moc
生成的代码中编译/链接
我很确定您的代码没有任何问题 - 所以错误一定是在 qt creator 中的某些设置中,因为我没有经常使用它,所以我无能为力。
如果您还没有,您可以尝试在 hexbutton.hpp 中添加显式的空析构函数声明,在 hexbutton.cpp 中添加定义。这不应该是必要的,但我听说这会对一些古怪的编译器/链接器产生影响。
【讨论】:
我刚刚注意到您已将其标记为 qt-creator - 假设您使用的是标准创建者项目,构建系统应该不是问题。我可能会在此基础上收回这个答案。 我使用了 Qt Creator 和一个“空项目”。谢谢。【参考方案9】:尝试删除 pro.user 文件并使用任何 qt 32 位套件重新导入项目。
【讨论】:
以上是关于QT C++新手问题:collect2:ld returned 1 exit status的主要内容,如果未能解决你的问题,请参考以下文章
Qt 创建者中的“collect2:ld 返回 1 个退出状态”
Qt build 无法添加 com dll [collect2: ld returned 5 exit status]
QT 错误 :-1: error: collect2: ld 返回 1 这是啥错误 求大神指导
错误:未找到架构 x86_64 的符号,collect2:ld 返回 1 退出状态