2013-12-08 33 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庫。
  • 庫文件實際上與應用程序對象文件不兼容(使用不同的編譯器或選項編譯),所以鏈接程序在那裏找不到符號。解決方案是用正確的編譯器和選項重建庫。

如果調用構造函數有效,但找不到這一個方法,則第一個選項似乎最有可能。

相關問題