2012-08-02 85 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

在我的情况下,我在头文件本身实现了一个函数。在函数为我解决错误之前添加一个静态内联关键字。