3

「AppleMach-Oリンカー(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
...

「.h」の代わりに「.m」のインポートがあるかどうかはすでに確認しましたが、すべて正しいです。何か考え、この問題を引き起こす可能性があるのは何ですか?

編集:「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 diff with Java、C#、Ruby、Python ..

ファイルを分割します。

ヘッダー&mm

#includeを使用しないでください(何度も含めることができます)

#importを使用...(1回含める)


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;
}
...
于 2012-08-02T09:24:57.463 に答える
2

あなたの問題に対する2つの解決策:

  1. ヘッダーファイルでのみ宣言void matrixIdentity(mat4 m);してから、対応するc/mファイルに実際のコードをインプルメントします。
  2. ヘッダーファイルの関数をインラインにします(これはAppleが使用する手法です)

    inline void matrixIdentity(mat4 m) { ...

于 2012-08-02T09:31:20.937 に答える
1

あなたの説明から、utils.hは変数を宣言して実装します。その実装は、utils.hが両方に含まれているため(Corridor.hの場合はDrawable.hを介して間接的に)corridor.hとDrawable.hにコンパイルされます。 )。したがって、両方のコンパイルユニットに_matrixIdentityの実装が含まれており、リンカは文句を言います。

_matrixIdentityの実装を新しいモジュールutils.mに移動して、シンボルの定義が1つだけであることを確認します。

于 2012-08-02T08:58:16.660 に答える
0

他のリンカーフラグで1つのライブラリに-force_loadを使用します..これで問題が一度解決されました

于 2013-04-05T12:46:11.280 に答える
0

私の場合、ヘッダーファイル自体に関数を実装していました。関数の前に静的インラインキーワードを追加すると、エラーが修正されました。

于 2015-05-01T10:49:50.873 に答える