尝试继承时Qt中的LNK错误?

Posted

技术标签:

【中文标题】尝试继承时Qt中的LNK错误?【英文标题】:LNK Errors in Qt when trying to inherit? 【发布时间】:2013-12-08 13:11:49 【问题描述】:

我正在尝试从另一个类 Bookmarks 调用方法,但是在构建程序时我不断收到 LNK 错误,我不明白为什么。

mainwindow.obj:-1: error: LNK2019: unresolved external symbol "public: class QStringList     __cdecl Bookmarks::getList(void)" (?getList@Bookmarks@@QEAA?AVQStringList@@XZ) referenced in     function "private: void __cdecl MainWindow::on_save_book_clicked(void)" (?on_save_book_clicked@MainWindow@@AEAAXXZ)

debug\WebBrowser.exe:-1: error: LNK1120: 1 unresolved externals

当然,第二个错误的存在是因为第一个错误,至少我知道的这么多。

我已经声明了我的标题,包括我想使用的类:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "bookmarks.h"

这是我正在尝试使用的插槽:

void MainWindow::on_save_book_clicked()

    Bookmarks *bm = new Bookmarks();

    QStringList book = bm -> getList();

    QFileDialog *fd = new QFileDialog;
    QString fileName = fd -> getSaveFileName(this,
                                          tr("Save Bookmarks"), "",
                                          tr("Bookmarks (*.txt);;AllFiles (*)"));

    if (fileName.isEmpty())
    
         return;
    
    else
    
         QFile file(fileName);
         if (!file.open(QIODevice::WriteOnly))
         
             QMessageBox::information(this, tr("Unable to open file"),     file.errorString());
         
         return;

         QDataStream out(&file);
         out.setVersion(QDataStream::Qt_4_5);
         out << bm;
    
    

我已确定错误来自以下行:

QStringList book = bm -> getList();

当我将其注释掉时,我不再收到链接错误,尽管我不知道它导致了什么问题。这是为什么呢?

【问题讨论】:

Bookmark 类是否定义在共享库中? getList() 函数真的定义了吗? 在不了解项目结构的情况下很难解决链接器错误。您必须问自己,链接器能否到达bookmarks.cppbookmarks.lib(我假设它是这样调用的),解决这个问题的一个好方法是调用Bookmarks 的另一个函数,看看是否有效。跨度> 你在创建书签类后运行过qmake吗? 【参考方案1】:
mainwindow.obj:-1: error: LNK2019: unresolved external symbol "public: class QStringList     __cdecl Bookmarks::getList(void)" (?getList@Bookmarks@@QEAA?AVQStringList@@XZ) referenced in     function "private: void __cdecl MainWindow::on_save_book_clicked(void)" (?on_save_book_clicked@MainWindow@@AEAAXXZ)

debug\WebBrowser.exe:-1: error: LNK1120: 1 unresolved externals

这个错误意味着QStringList __cdecl Bookmarks::getList(void)函数不在库中。

您可能正在使用/Gd 选项编译代码,而库是使用其他一些编译器选项编译的,例如/Gr/Gv。所以:

    使用与库相同的编译器选项(尤其是调用约定)编译代码

    或者将显式调用约定放在函数前面

    QString __fastcall(或任何需要的) Bookmarks::getList(void)

这个article 可能会对你有所帮助。

【讨论】:

【参考方案2】:

如果它是您自己的库,并且编译器很高兴但链接器抱怨,那么替代方案是

您实际上没有定义Bookmarks::getLine() 方法(仅在使编译器满意的类定义中声明)。请注意,您可能有重载,因此您可能忘记了此方法定义,而有其他不同重载的方法定义,因此在检查时要非常迂腐。 您忘记将库添加到链接中(您只添加了使编译器满意的包含路径)。在qmake中,需要LIBS += -Lpath -lname添加libname库。 库文件实际上与应用程序目标文件不兼容(使用不同的编译器或选项编译),因此链接器找不到那里的符号。解决方案是使用正确的编译器和选项重建库。

如果调用构造函数有效,但没有找到这个方法,第一个选项似乎最有可能。

【讨论】:

以上是关于尝试继承时Qt中的LNK错误?的主要内容,如果未能解决你的问题,请参考以下文章

链接来自另一个文件的函数时,Qt 上出现错误 LNK 2019 [重复]

LNK1104 将 Boost 库添加到 Qt 项目时出错

使用 qt creator 和 eigen 库编译程序时出现 lnk2019 错误

Qt Creator 链接器错误:LNK1104:无法打开 fil 'usb-1.0.lib' - Windows

构建一个最小的 Qt 控制台项目失败,出现一个神秘的链接器错误 LNK2001: Unresolved external Symbol

QT Creator - LNK2019 和 LNK1120 错误 [重复]