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'

参考技术A ld returned 1 exit status说明链接错误

底下不是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 退出状态

错误消息:在 crt1.10.6.ol 开始 ld:找不到符号 collect2:ld 返回 1 个退出状态

make collect2: ld terminated with signal 9 错误解决办法