【发布时间】:2016-10-21 17:38:43
【问题描述】:
我有一个静态库,里面有另一个静态库。
我们称它们为 LibA 和 LibB。
LibA 是面向外部的库,或者换句话说,LibA 在内部调用 LibB,而 LibB 没有面向外部的函数调用。
LibA 的标头是 extern C,因此名称不会被破坏。
我已经使用 Swift 测试了这个库,它运行良好。
但是,当我尝试在 Obj-C 项目中使用它时,我收到以下错误:
"_OBJC_CLASS_$_UIResponder", referenced from:
_OBJC_CLASS_$_AppDelegate in AppDelegate.o
"_OBJC_CLASS_$_UIViewController", referenced from:
_OBJC_CLASS_$_ViewController in ViewController.o
"_OBJC_METACLASS_$_UIResponder", referenced from:
_OBJC_METACLASS_$_AppDelegate in AppDelegate.o
"_OBJC_METACLASS_$_UIViewController", referenced from:
_OBJC_METACLASS_$_ViewController in ViewController.o
"_UIApplicationMain", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我确保 LibA 和 LibB 都是为 x86_64 架构构建的。
非常感谢任何帮助。
编辑:我能够解决这个问题。在 Build Phases 下,我必须将 UIKit.framework 添加到 Link Binary with Libraries。这修复了错误并允许我使用我的库。感谢您的帮助!
【问题讨论】:
-
它抱怨的符号来自 UIKit。我猜这与您的实际应用有关,而不是与您的库有关。
-
从 ~/Library/Developer/Xcode/DerivedData/ 中删除派生数据,然后清理,再次构建。希望它有效。
-
这看起来 UIKit 没有在项目中链接。看到它在更大的项目中链接,或者从链接库中删除依赖项。我强烈建议转向动态框架。
-
我确实尝试删除 DerivedData 文件夹,但不幸的是没有修复它。我确实注释掉了引用我的库的所有内容,并且错误仍然存在,所以这似乎是问题所在。关于如何解决这些问题的任何想法?
-
如果你的库是静态链接的并且内部访问
UIResponder或UIViewController,链接器会失败。将UIKit.framework添加到您应用的目标中。
标签: ios xcode static-linking objective-c++