尝试继承时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.cpp
或bookmarks.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 [重复]
使用 qt creator 和 eigen 库编译程序时出现 lnk2019 错误
Qt Creator 链接器错误:LNK1104:无法打开 fil 'usb-1.0.lib' - Windows
构建一个最小的 Qt 控制台项目失败,出现一个神秘的链接器错误 LNK2001: Unresolved external Symbol