連結器與載入器與執行檔格式

連結C語言程式時出現「undefined reference to `foo'」(對foo的未定義參照)錯誤,最可能的原因為下列何者?

  1. Afoo之中有語法錯誤
  2. B在兩個檔案中都定義了foo
  3. C有呼叫foo,但定義foo內容的檔案或函式庫未包含在連結之中
查看答案與解析

正確答案:C. 有呼叫foo,但定義foo內容的檔案或函式庫未包含在連結之中

只要在標頭檔中宣告了函式,編譯就能通過。但連結時若找不到定義foo的目的檔或函式庫,就無法決定要填入呼叫指令的位址,因而出現此錯誤。常見原因有:忘了連結定義的檔案、忘了指定函式庫(如-lm等)、因名稱拼寫或參數不同而變成另一個名稱等。

  • A. 若是語法錯誤,會在編譯階段就停止。
  • B. 若有兩個,會出現重複定義的錯誤。
  • C. 正確。這是有宣告但找不到定義的狀態。
練習這個領域 前往領域頁面

連結器與載入器與執行檔格式的其他題目

  1. 在a.c與b.c中都定義了未加static、同名的全域函式void init(void),然後進行連結。下列關於會發生之情形的敘述,何者正確?
  2. 在C語言中以static定義函式時(例:static int helper(void)),下列關於其效果的敘述何者正確?
  3. 在C語言中寫下「extern int count;」時,下列關於其意義的敘述何者正確?
  4. 關於Linux等系統常用的ELF格式檔案,下列何者正確?
  5. 執行檔的.text區段中存放的是下列何者?

這個領域的比較