Xcode重复符号错误

3
我遇到了“Apple Mach-O Linker (Id) Error”错误:
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”只是这个文件中的第一个函数,问题可能不在实现上。


“_matrixIdentity” 在 “Utils.h” 文件中是如何定义和实现的?请同时发布您的 “utils.h” 代码。 - meronix
你的 .m 文件中有全局变量吗? - Midhun MP
5个回答

2

C/C++/Objective-C 与 Java、C#、Ruby、Python 的区别...

将文件分成头文件和实现文件。

头文件使用 .h 后缀,实现文件使用 .mm 后缀。

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

2

解决您的问题有两种方法:

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

    inline void matrixIdentity(mat4 m) { ...


1
根据您的描述,utils.h声明并实现了一个变量,由于Drawable.h间接包含在Corridor.h中,因此utils.h被两者都包含,导致_matrixIdentity的实现在两个编译单元中都存在,从而导致链接器报错。
将_matrixIdentity的实现移动到新模块utils.m中,以确保该符号只有一个定义。

我的错,“matrixIdentity”不是一个变量,而是一个函数。谢谢您的回复,我会尝试一下。 - user1570730

0
在“其他链接器标志”中使用“-force_load”选项来针对一个库解决问题。

0
在我的情况下,我正在头文件中实现一个函数。在函数前添加 static inline 关键字为我解决了这个错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接