7

デバイス (ipad 3) 用にビルドすると、ビルドは警告やエラーなしで動作しますが、iPad または iPhone シミュレーター用にビルドすると、次のようなリンカー エラーが表示されます。

duplicate symbol _CONSTANT_NAME in:
/Users/me/libLibrary.a(FileName.o)
/Users/me/libOtherLibrary.a(OtherFileName.o)

定数はヘッダーファイルでそのように定義されています

const int CONSTANT_NAME = 123;

定数を #define タグで次のようにラップしようとしました。

#ifndef CONSTANTS_H
#define CONSTANTS_H

const int CONSTANT_NAME = 123;

#endif

デバイス用のビルドでは問題なく動作するのに、シミュレーター用のビルドでは問題が発生するのはなぜですか?

4

1 に答える 1

13

コンパイラは正確に正しいことを伝えています。幸運なことに、iPad に直接ビルドするときに、この問題は発生しません。

このヘッダーをインクルードするすべての .m ファイルで、同じ名前の新しい個別の変数を作成します。コンパイラは、これらすべてのファイルを単一の .a にリンクするときにこれを解決できますが、複数の .a ファイルがビルドされ、それらの複数の .a ファイルが一緒にリンクされている場合、コンパイラは重複コピーについてコンパイルします。

次の 3 つのいずれかを行います。

  1. を に変えconst intます#define#define CONSTANT_NAME 123
  2. の前に static を追加しますconst intstatic const int CONSTANT_NAME = 123;
  3. 前に externを追加し、単一の .mconst intに実数を追加します。const int.h では、extern const int CONSTANT_NAME;. 単一の .m では、const int CONSTANT_NAME = 123;.

const int CONSTANT_NAME = 123;最後の例では、定義を保持する別の場所として constants.m ファイルを作成します。

それが役立つことを願っています。

于 2012-09-04T14:08:19.840 に答える