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" 引用自:tests.o 中的-[Object testMethod]

"_a_variable" 引用自:tests.o 中的-[Object testMethod]

"_an_array" 引用自:tests.o 中的 -[Object testMethod]

Symbol(s) not found Collect2: Id returned 1 exit status

有没有人遇到过这个问题?我知道我在做一些愚蠢的事情,我错过了一些关键的 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顺便说一句,当它实际上是 a 时调用它const有点误导!

于 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 回答