几年前,我已经使用Xcode 5或6完成了这项工作。现在使用Xcode 8或9,我似乎缺少了一些东西。 无论我做了什么,当我尝试构建和链接我的项目时,我收到链接器消息:
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)
这不是一个重复的问题。这不是架构问题。 我在S-O或Google上找到的其他结果都没有解决此问题。
我显然错过了一些构建设置,但无法弄清楚哪一个(s)。 在构建尝试之间,我清理了构建文件夹,并删除了DerivedData。退出并重新启动Xcode。使用新工作区创建了一组新项目,并完成了下面列出的步骤。
如果重要的话,我正在为这个项目编写Objective-C(我不认为这样做)
我的问题是我忘记了什么?
我做了什么 -
为我的框架和静态库创建项目
a)为可可触摸框架创建项目 - 让我们称之为mySDK,创建mySDK.framework
b)为可可触摸静态库添加目标 - 让我们称之为创建libSDK.a的SDK
c)可选择构建两个目标 - 它们构建良好
d)关闭项目
为我的应用程序创建项目 - myApp - 然后关闭项目
创建工作区 - myWorkspace - 并打开工作区
将项目文件从#1 mySDK和#2 myApp拖到工作区
构建框架和静态库(成功构建和创建目标)
将静态库添加到myApp
a)选择myApp并转到构建阶段
b)使用库打开链接二进制文件
c)从库构建产品libSDK.a拖到链接二进制文件窗格中,设置为“必需” 该库现在显示在myApp7)选择myApp项目并转到build-settings
Add to Header Search Paths = "$(SRCROOT)/../mySDK/mySDK"
这解决了查找标题时的编译错误
现在我问,为什么我不需要做任何其他事情,Xcode应该不知道其余部分了吗?
我评论过的各种解决方案或教程建议添加:
我已经尝试了所有这些不同的组合。
一旦我将库添加到myApp,我发现在构建库时Frameworks / libSDK.a文件从红色变为黑色,因此工作区/项目中的某些内容知道我构建了库并且它看到了它。
那么为什么当我尝试构建myApp时,我仍然会看到线程错误:
架构arm64的未定义符号: “_OBJC_CLASS _ $ _ MyClass”,引自: ViewController.o中的objc-class-ref ld:找不到架构arm64的符号 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
我所做的一切似乎都没有明白这个错误。我正在试着寻找一个解决方案。
我还检查过它正在构建所有适当的架构,使用'lipo -info'确认它
Xcode显然知道这个库,为什么不链接?
答案 0 :(得分:0)
虽然这不是指定Objective-C的问题的准确答案,但我提供它以防止@reststop或帮助遇到问题的人并像我一样搜索答案。 (请不要投票。)
我的应用程序也编译没有问题,但在链接到静态库时会遇到错误。我的库基于C ++。
在我的案例中我有两个问题要解决:
标头缺少对C ++文件中C函数的正确extern "C"
声明。
一个.cpp文件没有#include其匹配的标头,因此extern "C"
将正确应用于编译版本。
链接器出现问题,因为编译器因错误而使用了错误的函数名称。后来通过使用文本编辑器查看.a文件来确认这一点。我找到了我的函数,前缀为“_Z11”,后缀为“v”。
还有另一个线索:错误是报告缺少的函数名称,前面有一个下划线。
Undefined symbols for architecture arm64:
"_myCFunction", referenced from:
SwiftModule.swiftFunction () -> () in MySwiftClass.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)