2013-04-24 256 views
1

我正在使用Xcode構建C++項目。Apple Mach-O鏈接器命令失敗,退出代碼爲1

但我不明白的錯誤消息:

「蘋果的Mach-O連接器命令退出碼1失敗」我發現的#include就是這個原因。

我有兩個包含相同.h文件的.cpp文件。如果我刪除#包括一個,它將被成功構建。

其他頭文件很好,期望上面描述的頭文件。我已經使用「ifndef」。

回答

3

#ifndef包括守衛只在翻譯單位(通常是單個源文件)的級別工作。

如果您在翻譯單元,這將不會被固定兩次定義相同的對象包括後衛,但是當你試圖將兩個目標文件合併成一個單一的可執行文件鏈接器會痛苦地抱怨。

我懷疑你的情況是類似的:

hdr.h: 
    #ifndef HDR_H 
     #define HDR_H 
     void rc(void); 
     int xyzzy; 
    #endif 

prog1.c: 
    #include "hdr.h" 
    #include "hdr.h" 
    int main (void) { rc(); return xyzzy; } 

prog2.c: 
    #include "hdr.h" 
    void rc(void) { xyzzy = 0; } 

在那樣的情況下,包括被列入後衛將阻止頭兩次prog1.c,但它仍然會包含在這兩個prog1.cprog2.c ,這意味着每個將具有xyzzy的副本。

當您將它們鏈接在一起時,鏈接器將不會那樣。

的解決方案是在頭不明確的事情,但僅僅宣稱他們那裏,留下定義的C文件:

hdr.h: 
    #ifndef HDR_H 
     #define HDR_H 
     int rc(void); 
     extern int xyzzy;    // declare, not define 
    #endif 

prog1.c: 
    #include "hdr.h" 
    #include "hdr.h" 
    int main (void) { rc(); return xyzzy; } 

prog2.c: 
    #include "hdr.h" 
    int xyzzy;       // define 
    int rc(void) { xyzzy = 0; } 

聲明,東西之類的函數原型,EXTERN變量,類型定義等等(簡單地說,那些聲明事物並不實際創建「對象」的東西)。

定義是創建「對象」的東西,像非外部變量等。

你需要跟蹤什麼「對象」被定義了兩次(連接器輸出應該有類似doubly-defined symbol 'xyzzy'),然後確保它不是在頭文件中定義

+0

感謝您的解釋。非常有幫助的說明 – 2013-07-26 19:35:52

相關問題