“符号定义的未定义符号”在符号定义存在时发出错误(使用静态库)

时间:2013-07-17 17:14:57

标签: ios xcode static-libraries clang symbols

我正在开发一个带有演示项目的开源iOS静态库。我创建了我的“库”xcodeproj,创建了一个类DKNavigationBar,包含它我必须包含它。然后我创建了一个“demo”xcodeproj并将“library”xcodeproj拖入其中。我在“Target Dependencies”部分中包含了我的静态库,并使用#import <MyLibrary/MyLibrary.h>在pch文件中导入了我的库。我构建了演示项目,没有任何错误。然后,在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; DR

  1. 我创建了一个静态库项目,并且正确地完成了所有工作
  2. 我创建了一个演示项目,将库项目拖入其中并将我的库包含在“Target Dependencies”中,并正确地完成了所有工作
  3. Xcode识别头文件,而实时调试器没有错误。
  4. 构建时,弹出undefined symbols for architecture clang错误
  5. 我检查了我构建的libMyLibrary.a文件,发现我的符号定义

  6. P.S。

    我正在使用Xcode 5的DP3,但我不讨论它的功能或其他什么,所以不要再告诉我它是在NDA下,因为我没有违反协议。我只是让你知道它可能是测试版软件中的一个错误(但我不这么认为)。

1 个答案:

答案 0 :(得分:3)

在构建阶段的“Link Binary With Libraries”下添加库。