【问题标题】:Frameworks for static libraries xcode静态库 xcode 的框架
【发布时间】:2011-02-25 13:42:16
【问题描述】:

我刚刚使用Process for linking static ObjC libraries in XCode 此处的问题和答案中链接到的文档向我的项目添加了一个链接库。

我碰巧知道该库使用 CoreData 对象,例如 NSManagedObject,尽管在该库的 xcode 项目中没有添加 CoreData 框架并且它构建时没有错误。但是,当我构建我的应用程序时,它会出现几个错误,例如:

Undefined symbols:
"_OBJC_CLASS_$_NSManagedObject", referenced from:
  _OBJC_CLASS_$_AClass in library.a(AClass.o)

所以看到所有提到 CoreData 对象的错误,我将 CoreData 框架添加到我的应用程序并成功构建。 所以现在我尝试从我的应用程序中删除 CoreData 框架,并将其添加到库项目中,然后它们都构建了,但它失败了。

那么当我在我的项目中添加了 coredata 但在库项目中没有添加,并且只有库使用它时,为什么它会起作用?

(以及为什么库构建时不需要 coredata 框架?)

【问题讨论】:

    标签: objective-c xcode static-libraries


    【解决方案1】:

    库是静态的。它不是一段独立的代码,它必须被链接起来。

    您的应用程序已链接,这意味着链接器会解析所有外部依赖项并在最终可执行文件中填写库函数的地址。

    如果您想在应用程序中使用具有 Core Data 依赖项的库,则必须链接到 Core Data.framework。

    将链接阶段添加到静态库没有任何效果,因为创建静态库时不涉及链接器,只有编译器(和存档器)。

    【讨论】:

      【解决方案2】:

      现在,有时可以通过在库头文件中使用新的 @import 语法来避免该问题。即使您使用静态库,编译器也会自动链接到使用的框架。

      【讨论】:

      • 那句话对我来说似乎有点太无定形了......“有时”是什么意思......如果你有这个建议有效的上下文,那么它似乎是一个很好的解决方案。
      猜你喜欢
      • 2014-05-05
      • 2010-12-26
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      相关资源
      最近更新 更多