在Swift模块中使用C库的链接器体系结构错误

时间:2015-12-22 13:18:36

标签: c swift compiler-errors frameworks linker

我有一个xcode工作区,结构如下:

  • 编译成框架的C库iGLPK(动态或静态,错误仍然存​​在)

  • 动态框架SwiftyGLPK,其iGLPK作为链接框架,并提供Swift包装器以使用C库

  • Frozen作为链接框架的xcode项目SwiftyGLPK

  • 使用SwiftyGLPK库的代码位于Model_GLPK项目中的单独框架目标Frozen中。这个框架编译得很好。

当我在主Frozen/ViewController中编写调用Model_GLPK并因此调用到下面的C库的代码时,问题出现了 - 它不会编译并产生这个链接器错误:

Undefined symbols for architecture arm64:
  "SwiftyGLPK.SolveGoal.Minimise (SwiftyGLPK.SolveGoal.Type) -> SwiftyGLPK.SolveGoal", referenced from:
  Frozen.ViewController.viewDidLoad (Frozen.ViewController)() -> () 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)

我在模拟器和设备上得到了相同的结果,只是未找到的架构发生了变化。

我还尝试从Model_GLPK框架中提取文件并将它们直接放入Frozen目标。现在一切都编译得很好,并且不再存在链接错误,而是在运行中遇到了严重的崩溃

dyld`dyld_fatal_error:
->  0x1200c1088 <+0>: brk    #0x3

在这条指令之后:

dyldbootstrap::start(macho_header const*, int, char const**, long, macho_header const*, unsigned long*)

任何人都可以了解正在发生的事情吗?

1 个答案:

答案 0 :(得分:1)

我找到了解决方案,但没有解释。

我再次逐步构建工作区,从直接在主项目中编译的C库开始,然后将其提取到框架中,然后将其Swift包装器提取到自己的框架中,然后创建内部模块链接到包装器。

现在一切正常但我仍然不知道为什么或之前有什么不同。整件事感觉非常脆弱。 _(ツ)_ /¯

module maps for static libraries上的这篇文章很有帮助,this one也是如此。这也是build settings reference