2013-12-08 36 views
0

我试图调用另一个类书签的方法,但是当我构建我的程序时我总是收到LNK错误,我不明白为什么。LNK尝试继承时出现Qt错误?

mainwindow.obj:-1: error: LNK2019: unresolved external symbol "public: class QStringList  __cdecl Bookmarks::getList(void)" ([email protected]@@[email protected]@XZ) referenced in  function "private: void __cdecl MainWindow::on_save_book_clicked(void)" ([email protected]@@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(); 

当我评论它,我不再收到链接错误,虽然我没有一个线索是什么问题造成的。为什么是这样?

+0

是在共享库中定义的Bookmark类吗?实际定义了getList()函数吗? – vahancho

+1

如果不知道项目结构,链接器错误很难解决。你必须问自己,链接器是否可以访问'bookmarks.cpp'或'bookmarks.lib'(我想这就是它的名称),找出这个问题的好方法是调用另一个'Bookmarks'函数,看看是否作品。 –

+0

你创建书签类后运行qmake吗? – UldisK

回答

0
mainwindow.obj:-1: error: LNK2019: unresolved external symbol "public: class QStringList  __cdecl Bookmarks::getList(void)" ([email protected]@@[email protected]@XZ) referenced in  function "private: void __cdecl MainWindow::on_save_book_clicked(void)" ([email protected]@@AEAAXXZ) 

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

此错误表示QStringList __cdecl Bookmarks::getList(void)函数不在库中。

您可能有可能使用/Gd选项编译代码,而使用其他编译器选项(如/Gr/Gv)编译该库。所以:

  1. 编译使用相同的编译器选项(尤其是调用约定)你的代码库
  2. ,或者把明确调用的函数前面约定

    的QString __fastcall(或任何要求)书签:: getList(void)

这个article可能会帮助你。

0

如果这是你自己的图书馆,以及编译器是幸福的,但连接抱怨,替代品是

  • 你实际上并没有Bookmarks::getLine()方法定义(仅在类的定义,这使得编译器高兴宣布)。请注意,你可能有重载,所以也许你忘记了这个方法的定义,而有其他方法定义是不同的重载,所以当你检查这个时会很迂腐。
  • 您忘记将库添加到链接中(您只添加了使编译器高兴的包含路径)。在qmake中,您需要LIBS += -Lpath -lname来添加libname库。
  • 库文件实际上与应用程序对象文件不兼容(使用不同的编译器或选项编译),所以链接程序在那里找不到符号。解决方案是用正确的编译器和选项重建库。

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

相关问题