静态库中的外部变量,使用Objective-C
我已经建立了一个静态库,可以链接到我的iPhone应用程序中。该库使用一些全局变量和函数,如C中的。我的问题是,当使用例如:静态库中的外部变量,使用Objective-C,c,objective-c,global-variables,static-libraries,extern,C,Objective C,Global Variables,Static Libraries,Extern,我已经建立了一个静态库,可以链接到我的iPhone应用程序中。该库使用一些全局变量和函数,如C中的。我的问题是,当使用例如: extern void do_stuff (const int a) { return a*a; } extern const int a_variable; extern const int an_array[DEFINED_VALUE]; 当我在代码中的任何地方使用这个函数或访问这些变量时,编译器会告诉我 “\u do\u stuff”引用自: -test
extern
void do_stuff (const int a)
{
return a*a;
}
extern const int a_variable;
extern const int an_array[DEFINED_VALUE];
当我在代码中的任何地方使用这个函数或访问这些变量时,编译器会告诉我
“\u do\u stuff”引用自:
-tests.o中的[Object testMethod]
“\u a\u变量”引用自:
-tests.o中的[Object testMethod]
“一个数组”引用自:
-tests.o中的[Object testMethod]
找不到符号
Collect2:Id返回1退出状态
以前有人遇到过这个问题吗?我知道我在做一些愚蠢的事情,我遗漏了一些关键的目标——C或C概念,但我真的看不出是什么。所以我希望有人能帮我。提前感谢。这些是链接器错误,告诉您无法找到引用的实体。这可能意味着您尚未将库添加到项目中 另外,您可能应该区分您声明这些东西的位置,它们确实应该声明为
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 };
另一方面,当某个
变量实际上是一个const
时,调用该变量有点误导人 @walkytalky-Well我在.a上运行nm,用grep进行过滤,查看这些符号是否已导出
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
host-006:发布iphonesimulator$nm-g libCardLib.a | grep CP_
nm:没有名字列表
你回来了
U\U CP\U文件\U扩展名\U后缀
U\U CP\U文件路径
U\U CP\U SUIT\U前缀
U\U CP\U值\U前缀
0000200d\u CP\u返回
00002018 D\u CP\u文件扩展名\u后缀
0000201c D_CP_文件路径
00002024 D_CP_前部
00002108 D_CP_SUIT_前缀
0000210c D_CP_值_前缀
nm:没有名字列表
nm:没有名字列表
nm:没有名字列表
因此,似乎每个符号都有一个未定义的副本?我尝试使用链接到目标应用程序的库,然后根据库目标使用目标应用程序。两者都产生相同的错误。至于declare/define点,我实际上在一个.mm文件中定义了值和函数体,为了简单起见,我只给出了一个示例。显然,这些变量没有命名为_变量,我只是因为sigil契约而无法显示任何代码。@Ricardo好的,这有点奇怪。检查库(blah.a
)是否实际出现在应用程序目标的“使用库链接二进制文件”阶段。还要检查库是否实际导出了所需的符号。如果这两个都是真的,那么我很困惑……既然你提到了它,也许它不是在全球范围内输出我想要的符号。“但我怎么能确定呢?”里卡多问得好。Xcode可能提供了一种友好的方法来实现这一点,但如果是这样,我不知道它是什么。但是,您可以在库文件上运行命令行工具nm
,并在输出中查找相关符号。你的变量应该有类型D
和函数类型T
。我希望我能假装知道这意味着什么,但我不知道。似乎.a文件可能包含多个符号表--可能针对不同的体系结构?--链接器正在寻找未定义的符号。但这在某种程度上超出了我的知识范围,所以不要听我的。希望知道他们在说什么的人很快就会出现!好的,谢谢你的帮助:)如果我不能在一天左右的时间内解决这个问题,我只需要复制头文件和实现文件。