使用静态库

时间:2017-10-11 12:05:48

标签: ios objective-c xcode static-libraries xcode-workspace

几年前,我已经使用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(我不认为这样做)

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

我做了什么 -

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

    a)为可可触摸框架创建项目 - 让我们称之为mySDK,创建mySDK.framework

    b)为可可触摸静态库添加目标 - 让我们称之为创建libSDK.a的SDK

    c)可选择构建两个目标 - 它们构建良好

    d)关闭项目

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

  3. 创建工作区 - myWorkspace - 并打开工作区

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

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

  6. 将静态库添加到myApp

    a)选择myApp并转到构建阶段

    b)使用库打开链接二进制文件

    c)从库构建产品libSDK.a拖到链接二进制文件窗格中,设置为“必需”       该库现在显示在myApp

  7. 中的Frameworks组区域中

    7)选择myApp项目并转到build-settings

    Add to Header Search Paths = "$(SRCROOT)/../mySDK/mySDK"
    

    这解决了查找标题时的编译错误

    现在我问,为什么我不需要做任何其他事情,Xcode应该不知道其余部分了吗?

    我评论过的各种解决方案或教程建议添加:

    • 其他链接标志= -ObjC
    • 图书馆搜索路径= $(BUILT_PRODUCTS_DIR)
    • 图书馆搜索路径=“$(SRCROOT)/../ mySDK”
    • 将“跳过安装”从“是”更改为“否”
    • 安装构建产品位置= $(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显然知道这个库,为什么不链接?

1 个答案:

答案 0 :(得分:0)

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

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

在我的案例中我有两个问题要解决:

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

  2. 一个.cpp文件没有#include其匹配的标头,因此extern "C"将正确应用于编译版本。

  3. 链接器出现问题,因为编译器因错误而使用了错误的函数名称。后来通过使用文本编辑器查看.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)