我刚刚使用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,只有库使用它呢?
(为什么库本身不需要coredata框架?)
答案 0 :(得分:4)
图书馆是静态的。它不是一个独立的代码,必须链接。
您的应用程序已链接,这意味着链接器会解析所有外部依赖项并填充最终可执行文件中库函数的地址。
如果要在应用程序中使用具有Core Data依赖关系的库,则必须链接Core Data.framework。
将链接阶段添加到静态库没有任何效果,因为创建静态库时只涉及链接器,只有编译器(和归档器)。
答案 1 :(得分:0)
现在,有时可以通过在库头文件中使用新的@import语法来避免此问题。然后编译器将自动链接到使用的框架,即使您使用静态库。