Xcode重复符号错误

时间:2012-08-02 08:46:24

标签: iphone objective-c ios xcode

我收到“Apple Mach-O Linker(Id)错误”:

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

类“Corridor”正在扩展“Drawable”类,“_ 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”只是这个文件中的第一个函数,可能是问题没有在实现中。

5 个答案:

答案 0 :(得分:2)

C / C ++ / Objective-C与Java,C#,Ruby,Python的差异......

分割文件。

标题&amp;毫米

不要使用#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;
}
...

答案 1 :(得分:2)

解决问题的两种方法:

  1. 在头文件中仅声明void matrixIdentity(mat4 m);,然后在相应的c / m文件中包含实际代码。
  2. 在内联头文件中使用您的函数(这是Apple使用的技术)

    inline void matrixIdentity(mat4 m) { ...

答案 2 :(得分:1)

根据你的描述,utils.h声明并实现一个变量,其实现是在corridor.h和Drawable.h中编译的,因为utils.h被包含在两者中(间接通过Drawable.h) Corridor.h)。 因此,两个编译单元都包含_matrixIdentity的实现,并且链接器会抱怨。

将_matrixIdentity的实现移动到新模块utils.m中,以确保只有一个符号定义。

答案 3 :(得分:0)

在其他链接器标志中为一个库使用-force_load ..这解决了我一次的问题

答案 4 :(得分:0)

就我而言,我在头文件本身中实现了一个函数。在函数修复错误之前添加静态内联关键字。