我正在开发一个带有演示项目的开源 iOS 静态库。我创建了我的“库”xcodeproj,创建了一个类DKNavigationBar
,将它包含在我必须包含它的地方。然后我创建了一个“演示”xcodeproj 并将“库”xcodeproj 拖入其中。我将我的静态库包含在“目标依赖项”部分中,并使用 .pch 将我的库导入到 pch 文件中#import <MyLibrary/MyLibrary.h>
。我构建了演示项目,完全没有错误。然后,在我的DKDAppDelegate.m
电话中[DKNavigationBar class]
- LLDB 没有给我任何错误。然后我建立了我的项目并蓬勃发展:
Undefined symbols for architecture i386:
"_OBJC_CLASS_$_DKNavigationBar", referenced from:
objc-class-ref in DKDAppDelegate.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
乍一看,这似乎是一个正常的错误:“哦,我忘记将我的源文件添加到'编译源'构建阶段”。但是当我越看越深入时,我意识到一切都设置正确。经过一些研究,我意识到符号定义存在于我的.a
文件中,并且为我的架构构建了静态库:
$ cd /path/to/derived/data/product/folder
$ lipo -info libMyLibrary.a
input file libMyLibrary.a is not a fat file
Non-fat file: libMyLibrary.a is architecture: i386
$ otool -MVv libMyLibrary.a
Archive : libMyLibrary.a
libMyLibrary.a(DKNavigationBar.o):
Module table (0 entries)
$ nm libMyLibrary.a
libMyLibrary.a(DKNavigationBar.o):
00000074 S _OBJC_CLASS_$_DKNavigationBar
U _OBJC_CLASS_$_UINavigationBar
00000060 S _OBJC_METACLASS_$_DKNavigationBar
U _OBJC_METACLASS_$_NSObject
U _OBJC_METACLASS_$_UINavigationBar
U __objc_empty_cache
U __objc_empty_vtable
00000038 s l_OBJC_CLASS_RO_$_DKNavigationBar
00000010 s l_OBJC_METACLASS_RO_$_DKNavigationBar
现在我不知道出了什么问题。任何帮助,将不胜感激。
TL;博士
- 我创建了一个静态库项目并正确完成了一切
- 我创建了一个演示项目,将库项目拖入其中并将我的库包含在“目标依赖项”中,并且一切正常
- Xcode 识别头文件并且实时调试器没有给我任何错误。
- 构建时,
undefined symbols for architecture
会弹出一个clang错误 - 我检查了我构建的 libMyLibrary.a 文件,发现我的符号定义在那里。