未解析的外部符号 - Qt creator

31

我肯定是对头文件和包含文件有一个基本概念的遗漏,因为当我试图从另一个源文件调用甚至是最简单的函数时,我会得到以下错误:

main.obj:-1: error: LNK2019: unresolved external symbol "void __cdecl buildDeck(int,int)" (?buildDeck@@YAXHH@Z) referenced in function _main

deck.h

#ifndef DECK_H
#define DECK_H
#include <QString>


void buildDeck(int deckSize, int jokers);


struct card
{
    QString suit;
    QString color;
    int rank;
};

#endif // DECK_H

牌堆.cpp

#include"mainwindow.h"
#include "deck.h"

void buildDeck(int deckSize, int jokers)
{
    int blackRed = deckSize-=jokers;
}

主函数.cpp

#include "mainwindow.h"
#include "deck.h"
#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    buildDeck(10,20);

    return a.exec();
}

这导致了一个错误。但是,如果我将函数定义从deck.cpp移动到main.cpp的底部,则应用程序将构建。

所有文件都包含在同一项目中,并存储在同一个目录中。

其他文件:

.pro文件

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = carddeck
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    deck.cpp

HEADERS  += mainwindow.h \
    deck.h

FORMS    += mainwindow.ui

不确定你是否需要,但这是mainwindow.h文件。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QTextEdit>
#include <QCheckBox>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void runButtonClicked();

private:
    Ui::MainWindow *ui;
    QPushButton *runButton;
    QTextEdit * runText;

    QCheckBox * betHearts;
    QCheckBox * betDiamonds ;
    QCheckBox * betClubs;
    QCheckBox * betSpades ;
    QCheckBox * betFlush ;
    QCheckBox * betAllRed;
    QCheckBox * betAllBlack ;

};

#endif // MAINWINDOW_H

那么,你得到的编译日志中未解决的符号是什么? - Archie
main.obj:-1: 错误: LNK2019: 未解析的外部符号 "void __cdecl buildDeck(int,int)" (?buildDeck@@YAXHH@Z),在函数 _main 中被引用。 - chuckieDub
刚试了一下你的代码,唯一得到的是一个未使用的blackRed变量的警告。没有链接错误。尝试清理构建并重新运行qmake。 - Archie
2个回答

80

看起来在编辑 .pro 文件时未重新生成 Makefile。 请运行 qmake 并重试。 您还可以检查 deck.cpp 是否已编译,以及构建目录中是否有 deck.o?


1
我认为这也会解决问题。但他需要先清理一下,以确保。 - UmNyobe
+1 @benjarobin,将小部件提升到自己的类之后,然后再降级,再次提升时,我一直遇到未解决的外部错误,无法摆脱它。由于我来自VC++背景,我认为只需清理和重建即可解决问题,但没有成功。这解决了我的问题。非常感谢。 - Rich
14
对于像我这样的Windows初学者: 1)构建->清理全部 2)构建->运行qmake 然后你就可以构建了。 我认为,既然我们在Windows上有全面的工具(QT Creator),我们不需要运行除“清理”和“构建”以外的任何其他内容。我还想尝试在命令提示符中输入qmake,但对我来说没有起作用。 - meakgoz
你可以通过重新加载 .pro 文件来在 Visual Studio 中完成相同的操作。 - Patapoom

3

有时候更改.pro文件后Makefile文件没有被更新,这时候你需要运行qmake来更新。

遵循以下步骤:

  • 右键点击项目Clean / Build菜单 -> cleanAll
  • 右键点击项目Run qmake / Build菜单 -> runQmake
  • 右键点击项目Build / Build菜单 -> build

专业建议:

我不知道为什么,但有时Qt没有更新Makefile文件。因此,我建议每当您向项目中添加/删除任何资源或在您的.pro文件中发生任何更改时,只需运行qmake并构建您的项目(手动运行qmake以更新项目路径,这有助于找到mainwindow.obj文件)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接