我正在尝试使用一个静态库(.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)
我通过执行以下步骤将库添加到我的目标:
- 右键单击我的项目
- 选择
'Add Files to "My Project"'
- 通过弹出的 Finder 窗口找到 .a 文件
- 验证库路径是否在我的
Target -> Build Settings -> Library Search Paths
(完成第 3 步时自动添加) - 将头目录添加到
Target -> Build Settings -> Header Search Paths
- 验证库是否列在
Target -> Build Phases -> Link Binary With Libraries
验证库是否编译为
armv7
viafile
,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 Dependency
inBuild 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
,并armv6
在Valid Architecture
下面Build Settings
用于我的目标和目标依赖项 - 设置
Build Active Architecture Only
为Yes
- 在项目组和父项目组级别添加库之间切换
- 在我的项目代码中从库中添加对象的导入和实例化
- 选择库时,在 XCode 右侧的窗口中使用库的不同设置进行
Location
播放Identity and Type
Utilities
Build Phases -> Link Binary With Libraries
通过+
then将库添加到目标Add Other...
我已经尝试了这些和其他帖子中的推荐步骤(只有最后两个列出的有实际说明):
我没有尝试将所有文件更改为 .mm (我不需要此库的以前版本),但我有很多 .m 文件,我认为如果我全部更改它们可能会损坏......
非常感谢任何帮助或成功!我真的很难弄清楚为什么这个新版本的库会给我带来问题。