3

我收到“Apple Mach-O 链接器 (Id) 错误”:

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

“走廊”类扩展了“可绘制”类,“_matrixIdentity”在文件“Utils.h”中定义和实现。以下是我的头文件中的顶行:

可绘制的.h

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

走廊.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”只是这个文件中的第一个函数,可能问题不在实现中。

4

5 回答 5

2

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

分割文件。

标题和毫米

不要使用#include(可能多次包含)

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


实用程序.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

实用程序.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;
}
...
于 2012-08-02T09:24:57.463 回答
2

您的问题的两种解决方案:

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

    inline void matrixIdentity(mat4 m) { ...

于 2012-08-02T09:31:20.937 回答
1

根据您的描述, utils.h 声明并实现了一个变量,由于 utils.h 包含在两者中(在 Corridor.h 的情况下,间接通过 Drawable.h )。因此,两个编译单元都包含 _matrixIdentity 的实现,并且链接器会抱怨。

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

于 2012-08-02T08:58:16.660 回答
0

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

于 2013-04-05T12:46:11.280 回答
0

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

于 2015-05-01T10:49:50.873 回答