5

iPhone アプリにリンクする静的ライブラリを作成しました。このライブラリは、C のようにいくつかのグローバル変数と関数を使用します。私の問題は、たとえば次を使用する場合です。

extern
void do_stuff (const int a)
{
    return a*a;
}

extern const int a_variable;
extern const int an_array[DEFINED_VALUE];

この関数を使用したり、これらの変数にアクセスしたりすると、コード内の任意の場所で、コンパイラが教えてくれます

"_do_stuff" から参照: -[Object testMethod] in tests.o

"_a_variable" から参照: -[Object testMethod] in tests.o

"_an_array" から参照: -tests.o の [Object testMethod]

シンボルが見つかりません Collect2: Id が 1 つの終了ステータスを返しました

誰もこの問題に直面したことがありますか? 私は愚かなことをしていることを知っています.Objective-CまたはCの重要な概念がいくつか欠けていますが、実際には何がわかりません. だから私は誰かが私を助けてくれることを望んでいました。前もって感謝します。

4

2 に答える 2

5

これらはリンカ エラーであり、参照されたエンティティが見つからないことを示しています。おそらくこれは、ライブラリをプロジェクトに追加していないことを意味します。

余談ですが、これらのことを宣言する場所 (実際には として宣言する必要がある場所) と、それらを定義するextern場所 (そうであってはならない場所) を区別する必要があります。つまり、以下を含むヘッダー ファイルがある可能性があります。

extern void do_stuff (const int a);
extern const int a_variable;
extern const int an_array[];

そして、次のような実装ファイル:

void do_stuff (const int a)
{
    return a*a;
}

const int a_variable = 42;
const int an_array[DEFINED_VALUE] = { 1, 2, 3, 4 };

余談ですが、a_variable実際にconstは a のときに何かを呼び出すのは少し誤解を招きます。

于 2010-06-25T11:21:59.717 に答える
0

@walkytalkyまあ、grepでフィルタリングされた.aでnmを実行して、それらのシンボルがエクスポートされたかどうかを確認しました。

host-006:Release-iphonesimulator <username>$ nm -g libCardLib.a | grep CP_
nm: no name list
     U _CP_BACK
     U _CP_FILE_EXTENSION_SUFFIX
     U _CP_FILE_PATH
     U _CP_SUIT_PREFIX
     U _CP_VALUE_PREFIX
00002020 D _CP_BACK
00002018 D _CP_FILE_EXTENSION_SUFFIX
0000201c D _CP_FILE_PATH
00002024 D _CP_FRONT
00002108 D _CP_SUIT_PREFIX
0000210c D _CP_VALUE_PREFIX
nm: no name list
nm: no name list
nm: no name list

では、シンボルごとに未定義のコピーがあるように見えますか?

于 2010-06-25T15:36:12.257 に答える