【问题标题】:extern variables in static library, using Objective-C静态库中的外部变量,使用 Objective-C
【发布时间】:2023-09-11 17:29:01
【问题描述】:

我已经构建了一个静态库,可以链接到我的 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]

找不到符号 Collect2: Id 返回 1 个退出状态

以前有人遇到过这个问题吗?我知道我在做一些愚蠢的事情,我错过了一些关键的 Objective-C 或 C 概念,但我真的看不出是什么。所以我希望有人能帮助我。提前致谢。

【问题讨论】:

    标签: c objective-c global-variables static-libraries extern


    【解决方案1】:

    这些是链接器错误,告诉您找不到引用的实体。这可能意味着您尚未将库添加到项目中。

    顺便说一句,您可能应该区分您声明这些东西的地方,它们确实应该声明为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 时调用 a_variable 有点误导!

    【讨论】:

    • 我尝试使用链接到目标应用程序的库,然后根据库目标尝试使用目标应用程序。两者都产生相同的错误。至于声明/定义点,我实际上在.mm文件中定义了值和函数体,为了简单起见,我只是举了一个例子。显然这些变量没有命名为 a_variable,由于 sigil 合同,我无法显示我的任何代码。
    • @Ricardo 好的,这有点奇怪。检查库 (blah.a) 是否确实出现在应用程序目标的“Link Binary With Libraries”阶段。还要检查库是否确实导出了所需的符号。如果这两个都是真的,那么我很难过......
    • 既然你提到了它,也许它没有在全球范围内导出我想要的符号。但是我怎么能确定呢?
    • @Ricardo 好问题。 Xcode 可能会提供一种友好的方式来做到这一点,但如果是这样,我不知道它是什么。但是您可以在库文件上运行命令行工具nm 并在输出中查找相关符号。你的变量应该有D 类型和你的函数类型T
    【解决方案2】:

    @walkytalky 好吧,我在 .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
    

    所以似乎每个符号都有一个未定义的副本?

    【讨论】:

    • 我希望我可以假装我知道这意味着什么,但我不知道。似乎 .a 文件可能包含多个符号表——可能适用于不同的体系结构? - 并且链接器正在寻找未定义的符号。但这超出了我的知识范围,所以不要听我的。希望知道他们在说什么的人很快就会出现!
    • 好的,不过还是感谢您的帮助 :) 如果我不能在一天左右的时间内解决这个问题,我会简单地复制头文件和实现文件。
    最近更新 更多