整合时出现链接错误 SKMaps.Framework

Linking Errors while integrating SKMaps.Framework

尝试集成 SKMaps 框架时出现这些错误

Undefined symbols for architecture x86_64:

  "CRouteTestManager::calculateRoute(NGRouteInput const&, std::__1::shared_ptr<CRoute>&)", referenced from:

      PoiTrackerTest::createRoute() in SKMaps(PoiTrackerTest.o)

  "_gpTestRoutesManager", referenced from:

      PoiTrackerTest::createRoute() in SKMaps(PoiTrackerTest.o)
      createNavigationObject(int) in SKMaps(NavigationTest.o)


ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

请帮我解决这个错误。

Environment :
Xcode 6.3.1, Mac OSX 10.10.3
Deployment Target iOS7.0

支持Swift。

我遵循了这个指南:http://developer.skobbler.com/getting-started/ios

并且还添加了 CoreMotion.framework,因为还存在与该框架相关的链接错误。

链接器错误的原因

这似乎是 linker 标记 -all_load 的结果,它可能已通过 CocoaPod 添加到您的项目中。在极少数情况下,您有一个只定义类别的静态库,那么您需要此标志。否则,它可以安全地从您的构建中删除。请参阅此处的讨论:

What does the -all_load linker flag do?

从该讨论的评论部分的 link 中,您可以看到之前需要 -all_load 的错误已在 XCode 4.

后得到修复

Objective-C categories in static library

可能的解释

这个框架内部定义了一堆测试,但是它们的依赖没有包含在框架中。当 linker 被迫解析和 link 所有依赖项时,它会出错,因为它找不到它们。基本上,应该清理库,使其不包含这些不必要的符号。解决方法是暂时删除 -all_load

面临同样的问题。删除 -all_load 标志没有帮助,所以我继续研究并找到了解决方案:

尽管 Skobbler 声明需要 linking libc++ 库,但实际上您需要 link libstdc++.6 库。请注意 linking libstdc++ 将无济于事。

P.S。 Xcode6.4,iOSSDK 8.4