0

几年前我用 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(我不认为它确实如此)

我的问题是我忘记了什么?

我做了什么 -

  1. 为我的框架和静态库创建一个项目

    a) 为 cocoa-touch 框架创建项目 - 我们称它为 mySDK,它会创建 mySDK.framework

    b) 为 cocoa-touch 静态库添加一个目标 - 我们称之为 SDK,它创建 libSDK.a

    c) 可选地构建两个目标——它们构建得很好

    d) 关闭项目

  2. 为我的应用程序创建一个项目 - myApp - 然后关闭该项目

  3. 创建一个工作区——myWorkspace——并打开工作区

  4. 将两个项目文件从 #1 mySDK 和 #2 myApp 拖到工作区

  5. 构建框架和静态库(构建和创建目标都成功)

  6. 将静态库添加到 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 显然知道这个库,为什么不链接呢?

4

1 回答 1

0

虽然这不是对指定 Objective-C 的问题的确切答案,但我提供它以防它帮助@reststop 或帮助遇到问题并像我一样搜索答案的人。(请不要投反对票。)

我的应用程序编译也没有问题,但在链接到静态库时会出错。我的库是基于 C++ 的。

在我的情况下,我有 2 个问题需要解决:

  1. 标头缺少extern "C"C++ 文件中 C 函数的正确声明。

  2. 一个 .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)
于 2018-05-08T23:37:34.823 回答