首頁 >後端開發 >C++ >為什麼我在 GCC C 中收到'對虛擬表和建構函數的未定義引用”連結器錯誤?

為什麼我在 GCC C 中收到'對虛擬表和建構函數的未定義引用”連結器錯誤?

Linda Hamilton
Linda Hamilton原創
2024-12-18 08:49:10437瀏覽

Why Am I Getting

GCC C 連結器錯誤:虛擬表和建構子的未定義引用

在C 中,虛擬函數允許衍生類別覆蓋其定義的方法基底類別。當連結使用虛擬函數的程式時,連結器要求這些方法的定義存在於目標檔案中。未能提供這些定義會導致未定義的引用錯誤,例如:

  • 對'vtable for XXX' 的未定義引用
  • 對'ClassName::ClassName()' 的未定義引用

可能原因

這些錯誤可能因多種原因而發生,包括:

  1. 沒有定義的重寫虛函數:如前所述,每個虛函數必須具有使用它的最終類別中的定義。如果在子類別中聲明了虛擬函數但沒有定義它,連結器將報告未定義引用錯誤。
  2. 缺少頭檔:包含該類別的頭檔定義可能未正確包含在使用它們的來源檔案中。
  3. 庫連結不正確:確保您是連結到包含您正在使用的類別的實作的正確庫。

確認靜態庫和類別可用性

  1. 庫位數: 檢查靜態庫是否為64位,請使用下列檔案指令:

    file -L <library_path>

    如果函式庫是64位,它應該顯示 64 位 x86-64 共享物件。

  2. 類別可用性: 使用objdump -t 指令檢查庫是否包含特定的class:

    objdump -t <library_path> | grep <class_name>

    如果該類別存在,它將在輸出中列出。

範例問題

如提供的錯誤日誌所示,對SomeClass::close() 的未定義引用表明該類別已被定義使用但尚未定義。同樣,對 SomeClass::SomeClass() 和 SomeOtherClass 的 vtable 的未定義引用表明 SomeOtherClass 類別的建構函數和虛擬表未在物件檔案中定義。

解決方案

要解決此問題,請確保在適當的子類中定義所有虛擬函數,包含所需的頭文件,並將正確的庫連結到您的節目。

以上是為什麼我在 GCC C 中收到'對虛擬表和建構函數的未定義引用”連結器錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn