首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Visual Studio 2013 連結錯誤 LNK2019/LNK1120 解決方案

     編輯:程式設計疑難解答

錯誤現象

在 VS2013 建置 C++ 專案時,出現以下連結錯誤:

錯誤 1 error LNK2019: 無法解析的外部符號 "public: void __thiscall Seqlist::Printlist(void)" (?Printlist@?$Seqlist@H@@QAEXXZ),該符號在函數 _wmain 中被引用
錯誤 2 error LNK1120: 1 個無法解析的外部命令

原因分析

LNK2019 表示宣告了函數但找不到定義(實作)。常見原因:

  • 頭文件宣告與 CPP 實作的簽章不一致(回傳型別、函數名、參數、const 屬性、模板參數)。
  • 類別模板成員函數定義未放在頭文件中(模板實作必須對編譯器可見)。
  • 專案中遺漏了包含實作的 .cpp 檔,或未加入建置。
  • 拼字錯誤:如 PrintList vs Printlist。

排查步驟

  1. 對照宣告與定義:打開頭文件與對應 .cpp,逐字比對 Seqlist::Printlist 的完整簽章。
  2. 檢查模板類別:若 Seqlist 是模板,成員函數實作必須在 .h 或 .inl 中,不能只放在 .cpp。
  3. 確認專案包含:在方案總管右鍵該 .cpp → 屬性 → 一般 → 從建置排除 應為「否」。
  4. 清理重建:執行「清理解決方案」→「重建解決方案」,排除殘留物件檔干擾。

快速修正範例

假設頭文件宣告:

template <typename T>
class Seqlist {
public:
    void Printlist(); // 宣告
};

實作必須寫在頭文件(或內含的 .inl):

template <typename T>
void Seqlist<T>::Printlist() {
    // 實作內容
}

總結

LNK2019 本質是「只有宣告、無定義」。模板類別特別注意實作可見性;非模板類別則檢查 .cpp 是否編入專案、簽章是否完全一致。養成「宣告即定義」或「分離式編譯時同步修改」的習慣可有效避免此錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved