2012-08-02 71 views
3

我得到「蘋果的Mach-O接頭(Id)的錯誤」:Xcode中重複的符號錯誤

ld: duplicate symbol _matrixIdentity in /BlahBlah/Corridor.o and /Blahblah/Drawable.o for architecture i386 

類「走廊」是擴展類「可繪」和「_matrixIdentity」的定義和實施一個文件「Utils.h」。下面是我的頭文件頂線:

Drawable.h

#import <Foundation/Foundation.h> 
#import "Utils.h" 
@interface Drawable : NSObject 
... 

Corridor.h

#import <Foundation/Foundation.h> 
#import "Drawable.h" 
@interface Corridor : Drawable 
... 

我已經檢查,如果有任何 「.M」 進口替代」。 h「,一切都是正確的。任何想法,可能會導致這個問題?

編輯:從「Utils.h」

#import <Foundation/Foundation.h>  
... 
#pragma mark - 
#pragma mark Definitions 

typedef float mat4[16]; 

#pragma mark - 
#pragma mark Functions 
void matrixIdentity(mat4 m) 

{ 
m[0] = m[5] = m[10] = m[15] = 1.0; 
m[1] = m[2] = m[3] = m[4] = 0.0; 
m[6] = m[7] = m[8] = m[9] = 0.0; 
m[11] = m[12] = m[13] = m[14] = 0.0; 
} 
... 

我只引用到我的兩個類方法「MAT4」的定義發佈代碼。另外,「matrixIdentity」只是這個文件中的第一個函數,可能是問題不在實現中。

+0

「_matrixIdentity」是如何在文件「Utils.h」中定義和實現的?發佈你的代碼utils.h,請 – meronix 2012-08-02 08:54:46

+0

你的.m文件中是否有全局變量? – 2012-08-02 09:23:03

+0

不,沒有那樣的。 – user1570730 2012-08-02 09:30:10

回答

2

C/C++/Objective-C的DIFF與Java,C#,紅寶石,巨蟒...

鴻溝文件。

頭&毫米

不要使用的#include(可能包括很多次)

使用#import ...(包括一次)


Utils.h

#ifndef __utils_h__ // <<< avoid multiple #include 
#define __utils_h__ // <<< avoid multiple #include 
#import <Foundation/Foundation.h>  
... 
#pragma mark - 
#pragma mark Definitions 

typedef float mat4[16]; 

#pragma mark - 
#pragma mark Functions 
extern void matrixIdentity(mat4 m); 

#endif // __utils_h__ <<< avoid multiple #include 

個Utils.mm

#import "Utils.h" 

void matrixIdentity(mat4 m) 
{ 
m[0] = m[5] = m[10] = m[15] = 1.0; 
m[1] = m[2] = m[3] = m[4] = 0.0; 
m[6] = m[7] = m[8] = m[9] = 0.0; 
m[11] = m[12] = m[13] = m[14] = 0.0; 
} 
... 
+0

謝謝,它的工作原理)。感謝大家的回覆。 – user1570730 2012-08-02 09:45:39

1

根據你的描述,utils.h聲明和實現了一個變量,它的實現是通過utils.h編譯進corridor.h和Drawable.h中的(兩者間接包含) Corridor.h)。 因此,兩個編譯單元都包含_matrixIdentity的實現,並且鏈接器抱怨。

將_matrixIdentity的實現移動到一個新模塊utils.m中,以確保符號只有一個定義。

+0

我的不好,「matrixIdentity」不是一個變量,而是一個函數。謝謝你的回覆,我會試一試。 – user1570730 2012-08-02 09:24:16

2

兩個解決您的問題:

  1. 只聲明void matrixIdentity(mat4 m);在頭文件,然後implment在相應的C/M文件的實際代碼。
  2. 請在頭文件內聯你的函數(這是該技術蘋果使用)

    inline void matrixIdentity(mat4 m) { ...

0

使用-force_load在其他連接標誌一個庫..這解決的概率爲我一次

0

在我的情況下,我在頭文件本身實現了一個函數。在函數爲我解決錯誤之前添加一個靜態內聯關鍵字。