几年前我用 Xcode 5 或 6 做过这个。现在使用 Xcode 8 或 9,我似乎缺少了一些东西。无论我做了什么,当我尝试构建和链接我的项目时,我都会收到 Linker 消息:
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_MyClass", referenced from:
objc-class-ref in ViewController.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
这不是一个重复的问题。这不是架构问题。我在 SO 或谷歌上找到的其他结果都没有解决这个问题。
我显然错过了一些构建设置,但无法弄清楚是哪一个。在构建尝试之间,我清理了构建文件夹,并删除了 DerivedData。退出并重新启动 Xcode。使用新工作区创建了一组新项目,并完成了下面概述的步骤。
如果这很重要,我正在为这个项目写 Objective-C(我不认为它确实如此)
我的问题是我忘记了什么?
我做了什么 -
为我的框架和静态库创建一个项目
a) 为 cocoa-touch 框架创建项目 - 我们称它为 mySDK,它会创建 mySDK.framework
b) 为 cocoa-touch 静态库添加一个目标 - 我们称之为 SDK,它创建 libSDK.a
c) 可选地构建两个目标——它们构建得很好
d) 关闭项目
为我的应用程序创建一个项目 - myApp - 然后关闭该项目
创建一个工作区——myWorkspace——并打开工作区
将两个项目文件从 #1 mySDK 和 #2 myApp 拖到工作区
构建框架和静态库(构建和创建目标都成功)
将静态库添加到 myApp
a) 选择 myApp 并进入构建阶段
b) 使用库打开链接二进制文件
c) 从库构建产品 libSDK.a 拖到链接二进制窗格中,设置为“必需”库现在出现在 myApp 的 Frameworks 组区域中
7) 选择 myApp 项目并进入 build-settings
Add to Header Search Paths = "$(SRCROOT)/../mySDK/mySDK"
这解决了查找标头时的编译错误
现在我问,为什么我需要做其他事情,Xcode 不应该解决剩下的事情吗?
我审查过的各种解决方案或教程建议添加:
- 其他链接标志 = -ObjC
- 库搜索路径 = $(BUILT_PRODUCTS_DIR)
- 库搜索路径 = "$(SRCROOT)/../mySDK"
- 将跳过安装从 YES 更改为 NO
- 安装构建产品位置 = $(BUILT_PRODUCTS_DIR)
我已经以不同的组合尝试了所有这些。
将库添加到 myApp 后,当我构建库时,我看到 Frameworks/libSDK.a 文件从红色变为黑色,因此工作区/项目中的某些内容知道我构建了库并且它看到了它。
那么为什么当我尝试构建 myApp 时,我仍然会看到线性错误:
架构 arm64 的未定义符号:“_OBJC_CLASS_$_MyClass”,引用自:ViewController.o 中的 objc-class-ref ld:未找到架构 arm64 的符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v查看调用)
我所做的一切似乎都无法清除该错误。我正在拔头发试图找到解决方案。
我还检查了它是否正在构建所有适当的架构,并使用“lipo -info”确认它
Xcode 显然知道这个库,为什么不链接呢?