2014-06-30 58 views
1

具有未定義符號的含義是什麼?Objective C鏈接器錯誤:未定義符號

代碼文件本身沒有錯誤,我不使用任何外部庫。

I DID在發生此鏈接器錯誤之前添加了一個typedef NS_ENUM

我在哪裏添加此-v to see invocation?

以下是錯誤消息:

Undefined symbols for architecture x86_64: 
    "_OBJC_IVAR_$_UIViewController._parentViewController", referenced from: 
     -[PEPI_LessonController setParentViewController:] in PEPI_LessonController.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

回答

1

這意味着把你的目標文件的文件時,它找不到財產parentViewController和方法setParentViewController。這些類型的錯誤最常見的原因是沒有鏈接項目目標中的庫或框架。 UIViewController是UIKit的一部分,所以如果它尚未鏈接,我會感到驚訝。這是一個OSX項目,你試圖使用UIViewcontroller而不是NSViewController?

+0

這是一個iOS(iPad)項目。我實際上是UIViewController的子類,不知道這意味着什麼。它在今天早上建立,但是在修改了一個主控制器中的一些代碼(負責選擇正確的視圖)後,我開始得到這個。我在此鏈接器錯誤發生之前添加了一個** typedef NS_ENUM **。 –

+0

@Guido Anselmi:檢查Xcode>您的項目>目標>「構建階段」>「與庫鏈接二進制文件」。那裏解決了大多數鏈接器問題。 –

+0

我需要添加什麼?我沒有在我的項目中使用任何外部庫。 NS_Enum類是否存在於外部庫中? –

3

「未定義的符號」

建築源代碼文件到可執行文件由至少兩個步驟:

  1. 源代碼文件編譯到中間二進制文件(通常稱爲xyz.o)。
  2. 將中間二進制文件鏈接到最終的可執行文件。

錯誤消息「未定義符號」是鏈接器消息。即使編譯過程在沒有通知的情況下成功,它也可能出現。鏈接器組織最終的內存地址關係,它將替換編譯器必須使用的符號假定它們將會有效後面的(如果代碼的所有部分都可用)。沒有這個,就沒有模塊化的可能。

-v看到調用

如果您在Xcode中創建你的應用程序,然後調用的Xcode所有的編譯和鏈接命令你(CompileCLnClang ...)。但請記住,典型的IDE只運行您可以在shell中運行的命令。理論上講,你只能在文本編輯器和shell中開發大型應用程序。所以我建議花一些時間並嘗試將Xcode構建報告中列出的一些命令複製到shell :-)您將學到很多關於背景的知識。因此,在我看來,-v to see invocation在shell中調用命令時使用 - 或者在構建設置中,如果您希望獲得永久更多的信息。

「外部庫」

最後,試圖澄清 「外部庫」。看一個最簡單的例子:即使你編寫了一個簡單的C程序,並且你想知道一些不重要的東西,比如一個字符串的長度,你會得到include <glibc.h>。現在這個一個外部庫。它是程序代碼的外部。你確定你沒有包含外部庫嗎?

解決連接器問題

鏈接錯誤往往是混亂和有些困難,因爲鏈接的模塊的細節往往是淡出人們的視線。如果您在搜索引擎中輸入錯誤消息,則可能會發現很多提示。例如,看看這裏:即使被發現

Undefined symbols for architecture armv7: "_SCNetworkReachabilityCreateWithAddress"

所有組件的連接,所有的路徑被稱爲等,他們可能有錯誤的版本,否則後果不堪設想。