1

我正在尝试使用一个静态库(.a),我也有它的头文件(没有 .m 文件),但是当我将库添加到我的目标时(甚至没有在我的项目代码中引用/导入库),我Undefined symbols for architecture armv7在编译时收到链接错误。链接器抱怨在最新版本的库中应该不再存在的类,并且可能正在使用缓存数据?如果我创建一个空白项目并以与将库添加到我的项目中完全相同的方式添加库,则新项目可以毫无问题地编译,这一发现可以支持这种怀疑。但另一方面,当我为链接器抱怨的类/变量 grep 文件系统时,我的静态库文件和我的xcuserdata工作区文件夹。所以我想知道问题出在我的项目中、我尝试导入的库中,还是我尝试将库添加到我的项目中的方式?而且,当我什至没有从我的代码中导入/调用库时,为什么会出现链接器错误?我正在使用XCode 4.6.1.

链接错误如下:

Undefined symbols for architecture armv7:
"_OBJC_IVAR_$_GenericPopupView.delegateTheme", referenced from:
  -[MyListView setDelegateTheme:] in myLib.a(MyListView.o)
  -[MyListView tableView:cellForRowAtIndexPath:] in myLib.a(MyListView.o)
"_OBJC_CLASS_$_SampleMarkView", referenced from:
  objc-class-ref in myLib.a(MyListView.o)
"_OBJC_CLASS_$_CheckMarkView", referenced from:
  objc-class-ref in myLib.a(MyListView.o)
"_OBJC_METACLASS_$_GenericPopupView", referenced from:
  _OBJC_METACLASS_$_MyListView in myLib.a(MyListView.o)
"_OBJC_CLASS_$_GenericPopupView", referenced from:
  _OBJC_CLASS_$_MyListView in myLib.a(MyListView.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我通过执行以下步骤将库添加到我的目标:

  1. 右键单击我的项目
  2. 选择'Add Files to "My Project"'
  3. 通过弹出的 Finder 窗口找到 .a 文件
  4. 验证库路径是否在我的Target -> Build Settings -> Library Search Paths(完成第 3 步时自动添加)
  5. 将头目录添加到Target -> Build Settings -> Header Search Paths
  6. 验证库是否列在Target -> Build Phases -> Link Binary With Libraries
  7. 验证库是否编译为armv7via file, otool, & lipo(听说库中可能还包含,但是我用三个命令的时候armv6s没看到)armv6

    $ file myLib.a
    myLib.a: Mach-O universal binary with 2 architectures
    myLib.a (for architecture armv7):   current ar archive random library
    myLib.a (for architecture cputype (12) cpusubtype (11)): current ar archive random library
    
    $ otool -L myLib.a
    Archive : myLib.a (architecture cputype (12) cpusubtype (11))
    …
    
    $ lipo -info myLib.a
    Architectures in the fat file: myLib.a are: armv7 (cputype (12) cpusubtype (11)) 
    

以下是我在每次编译尝试之间尝试过的事情,但没有任何成功:

  • 使用 (apple)+shift+k 清理项目
  • DerivedData使用 (apple)+alt+shift+k清理构建目录 ( )
  • DerivedData从命令行删除所有目录
  • 删除并重新将库及其标题添加到我的项目中
  • 添加没有标题的库
  • 将库放在作为目标依赖项的项目中,而不是直接放在我的项目中
    • 请注意,我无法将库添加为Target Dependencyin Build Settings;我应该能够吗?
    • 我也无法将库添加到目标Build Scheme(通过 XCode 菜单Product -> Scheme -> Edit Scheme... -> Build -> +
  • iOS Deployment Target通过in检查最低 iOS 版本Build Settings——我的目标和库都是 iOS 6.0
  • 删除了所有目标搜索路径,除了我的项目在没有新库的情况下构建所需的路径,如下所示(最重要的是我DerivedData从链接器路径中删除了);我的整体项目构建设置(不是目标的构建设置)不包含其他搜索路径

    标头搜索路径

    $(BUILT_PRODUCTS_DIR)/usr/local/include
    $(SRCROOT)/../MyLibDirectory/headers
    

    图书馆搜索路径

    $(inherited)
    $(SRCROOT)/../TargetDependencyDirectory
    $(SRCROOT)/../openssl/lib
    $(SRCROOT)/../MyLibDirectory
    
  • 删除了我机器上的所有其他库实例(旧版本)

  • 设置用户定义的构建设置USE_HEADERMAP = NO
  • 在新镜像的机器上安装新的项目结帐并重复上述所有步骤
  • 添加–ObjC++到其他链接器标志(-ObjC已经是链接器标志)
  • 单独使用armv6s,并armv6Valid Architecture下面Build Settings用于我的目标和目标依赖项
  • 设置Build Active Architecture OnlyYes
  • 在项目组和父项目组级别添加库之间切换
  • 在我的项目代码中从库中添加对象的导入和实例化
  • 选择库时,在 XCode 右侧的窗口中使用库的不同设置进行Location播放Identity and TypeUtilities
  • Build Phases -> Link Binary With Libraries通过+then将库添加到目标Add Other...

我已经尝试了这些和其他帖子中的推荐步骤(只有最后两个列出的有实际说明):

我没有尝试将所有文​​件更改为 .mm (我不需要此库的以前版本),但我有很多 .m 文件,我认为如果我全部更改它们可能会损坏......

非常感谢任何帮助或成功!我真的很难弄清楚为什么这个新版本的库会给我带来问题。

4

1 回答 1

0

我解决了自己的问题,或者更确切地说,问题出在我所包含的库的黑匣子上。从命令行在终端窗口中执行以下命令:

grep SampleMarkView myLib.a

结果是:

Binary File:myLib.a matches

我与创建库的人交谈,他们向我发送了一个不会导致问题的更新版本——我猜他们的代码中有旧的引用。因此,至少我希望这篇文章提供了一个列表,列出了如果您遇到库引用问题时可以尝试的各种事情!

于 2013-09-10T00:16:44.093 回答