【问题标题】:Static library woes in iPhone 3.x with categories and C librariesiPhone 3.x 中的静态库问题与类别和 C 库有关
【发布时间】:2011-02-04 22:06:25
【问题描述】:

我有一个 静态库(我们称之为 S),它使用一个 类别(来自 MGTwitterEngine 的 NSData+Base64)和一个 C 库 (由 ZipArchive 包裹的 MiniZip,一个 mm 文件)。

这个静态库用于一个iPhone 3.x 项目(我们称之为A)。为了能够使用 MiniZip 库,我将其文件包含在项目 A 以及静态库 S 中。如果没有,我会收到编译错误。

项目 A 在模拟器上运行良好。当我在设备上运行它时,使用类别时会出现无法识别的选择器错误。

正如这里所指出的,似乎有一个链接器错误会影响 iPhone 3.x (Categories in static library for iPhone device 3.0) 中的类别。解决方法是将 -all_load 添加到引用静态库的项目的 Other Linker Flags 中。

但是,如果我这样做,则会出现重复符号错误,因为我在项目 A 中包含了 MiniZip 库。

一种解决方法是在项目 A 中也包含类别文件。如果我这样做,项目 A 在设备中运行良好,但由于重复符号错误而无法在模拟器上构建。

我应该如何设置项目A才能使其在模拟器和设备上运行相同的配置?

【问题讨论】:

    标签: iphone objective-c xcode static-libraries categories


    【解决方案1】:

    您可以尝试使用 -ObjC 而不是 -all_load,它应该让链接器在不加载所有符号的情况下了解 Objective-C 类别(在某些情况下这对我有用,在其他情况下则不行)。

    另一种解决方法是不将 MiniZip 库包含到您的项目 (A) 中,而只包含头文件(这是正确编译项目所需的唯一文件)。然后链接器将使用链接到您的静态库的 MiniZip 库。

    【讨论】:

    • 谢谢!我之前使用过 -ObjC ,但它不起作用。据我了解,这是 iPhone 3.x 链接器中的错误。 -ObjC 不足以使链接器了解所有类别。关于第二种解决方法,如果我没有在项目 A 中包含 MiniZip 实现文件,我会收到“_OBJC_CLASS_$_ZipArchive”的符号未找到错误。 ZipArchive 是 mm 包装器。但是,如果我只包含 ZipArchive.mm 和头文件,它可以在模拟器和设备上运行。我会再等一会儿,看看其他人是否有更简单的解决方案,如果没有,我会选择你的答案。
    • 谢谢,我不知道这个错误,这也让我更清楚了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    相关资源
    最近更新 更多