Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
静态库中的外部变量,使用Objective-C_C_Objective C_Global Variables_Static Libraries_Extern - Fatal编程技术网

静态库中的外部变量,使用Objective-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

我已经建立了一个静态库,可以链接到我的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”引用自: -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文件可能包含多个符号表--可能针对不同的体系结构?--链接器正在寻找未定义的符号。但这在某种程度上超出了我的知识范围,所以不要听我的。希望知道他们在说什么的人很快就会出现!好的,谢谢你的帮助:)如果我不能在一天左右的时间内解决这个问题,我只需要复制头文件和实现文件。