0

プロジェクトでのリンク中に奇妙な動作が発生しています。

問題は、プロジェクトにリンクされたライブラリがあり、現在、いくつかのジェネリック クラスをプロジェクトからライブラリに移動する作業を行っていることです。

MyClass2 は基本的に MyClass と同じです。これは、両方のクラスに同じ名前のプロパティがいくつかあることを意味しますが、クラス (およびファイル) の名前が異なるため、リンク エラーが発生する理由がわかりません。

正確なエラーは次のとおりです。

duplicate symbol _comparePutFoldersFirst in:
    /Users/User/Library/Developer/Xcode/DerivedData/MyApp-aqfmfwpjnumbrjdrdqwonfwvhzaz/Build/Intermediates/MyApp.build/Debug-iphonesimulator/aTarget.build/Objects-normal/i386/MyClass.o
    /Users/User/Documents/..[path]../MyFramework.framework/MyFramework(MyClass2.o)
ld: 1 duplicate symbol for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

考慮事項: - .m ファイルは含まれていません (明らかに、私の調査に基づく一般的なエラーです) - これらのファイルに実装されているクラスは、両方のファイルで異なる名前になっています - ライブラリは実際にはフレームワークとしてラップされていることに注意してください。この問題は発生せずにライブラリをしばらく使用しているためです。

よろしくお願いします!

4

2 に答える 2

0

これらが実際のプロパティであるか、実際のインスタンス変数または適切に宣言されたクラス変数であるかは問題ではありません。

しかし、あまり正確に作業しなかった場合、これらの変数が実際には静的であるか、グローバルでさえあることがあるかもしれません。@implementationそれは、メソッドの間、またはメソッド本体の間の空きスペースで単にデラーされる場合です。

{ ... }次の@implementationステートメント内で適切に宣言されていることを確認してください。最近、ステートメントの後に iVars を使用して括弧を付けることもできると読みましたが、@implementation試したことはありません。ただし、これらのブラケットがなければ、それらは静的またはグローバルですらあります。つまり、2 つのクラスで宣言された同じ変数は、実際には重複したシンボルです。

Quick&Dirty: そのうちの 1 つの名前を変更するだけです。適切に: コードを少し再構築します。に続く.hファイルにそれらを集めて@interface、括弧で囲むことで行うことができます。

それらを .h ファイルに含めたくない場合は、空のカテゴリで .m ファイルを開始します。

@interface myClass2 () {
   int localInstanceVar1;
   NSInteger *localInstanceOjbekct2;
}
于 2013-02-26T14:22:17.267 に答える
0

@Hermannのコメントに基づいて、問題を見つけました(実際には複雑ではありませんでした:S)

私のコードは、.m ファイルで次のようにメソッドを定義していました。

NSInteger comparePutFoldersFirst(id aValue1, id aValue2, void *context) {...}

このメソッドは明らかに、競合の原因となったグローバル シンボルを生成します。

配列のソートにその方法を使用していたので、ブロックに変更すると問題はなくなりました。

于 2013-02-27T21:00:43.440 に答える