使用我的使用cocoapods

时间:2019-03-28 11:12:28

标签: swift xcode linker cocoapods

我正在迁移macOS项目,以便它可以拥有一个共享的跨平台框架,然后可以用来构建iOS和tvOS应用程序。我将代码分为API和macOS UI。但是因为我的API依赖于CocoaPods,所以我很快遇到了链接器问题:

  dyld: Library not loaded: @rpath/SwiftWebSocket.framework/Versions/A/SwiftWebSocket
  Referenced from: /Users/<my user name>/Library/Developer/Xcode/DerivedData/API-cqhjtidcxfuslhhfzzmfwzberuyg/Build/Products/Debug/API.framework/Versions/A/API
  Reason: image not found

搜寻了各种资源之后,我认为我可以找到一个解决方案。没运气。这是我尝试的失败的尝试:

  • 在目标“将二进制文件链接到库”中,将Pod的框架直接添加到最终应用程序中。结果为“ ld: framework not found SwiftWebSocket
  • 在框架API构建阶段中添加要与捆绑包资源一起复制的Pod框架。我的想法是至少可以确定它已包含在API框架中。结果,“没有这样的文件或目录”
  • 将框架设置为“可选”。结果是一个懒惰的绑定问题。

值得指出的是,我的API是该cocoapod的包装;我在应用程序中根本不需要它。我已经读过一些通过在应用程序中添加链接而起作用的hack,但即使这些对于我也不起作用。

我在项目设置上的技能水平不是很高。但是从所有这些错误中,对我看来,公开此API无效是因为寻找它的所有对象(dyld,ld或xcode构建过程)都找不到它。我的代码虽然可以编译并针对它进行链接。

关于它的价值,这是我的podfile。我用pod init生成了它,然后添加了我需要的东西:

target 'API iOS' do
    use_frameworks!
    pod 'SwiftWebSocket', '~> 2.7'
    pod 'SwiftySound'
end

target 'API macOS' do
    use_frameworks!
    pod 'SwiftWebSocket', '~> 2.7'
    pod 'SwiftySound'
end

target 'API tvOS' do
    use_frameworks!
    pod 'SwiftWebSocket', '~> 2.7'
    pod 'SwiftySound'
end

我现在已经花了四个小时,对此感到非常沮丧。任何指针表示赞赏!

编辑:此外,这里是一些分析,因为我正在学习构建设置如何影响动态加载的路径。我在这里实时学习,所以如果出现问题,请告诉我。

分开错误,第一部分说:

dyld: Library not loaded: @rpath/SwiftWebSocket.framework/Versions/A/SwiftWebSocket

这意味着动态ld无法加载SwiftWebSocket库(它希望在该路径中找到的Pod之一)。

@rpath在构建设置中配置为“动态库安装名称库”。在“运行路径搜索路径”设置LD_RUNPATH_SEARCH_PATHS中设置的默认值为'@executable_path/../Frameworks''@loader_path/Frameworks'

错误的下一部分说:

  Referenced from: /Users/<my user name>/Library/Developer/Xcode/DerivedData/API-cqhjtidcxfuslhhfzzmfwzberuyg/Build/Products/Debug/API.framework/Versions/A/API

这是我围绕SwiftWebSocket包装的自定义框架的路径。

错误本身是Reason: image not found,我认为这是“找不到文件”错误。因此要弄清楚问题出在哪里,就必须看看这些路径是如何无法解析为SwiftWebSocket的。

因此,让我们手动解决这两个@rpath

思考 @executable_path表示上面引用的自定义框架的路径。因此,这意味着第一个@rpath将是一个目录,然后是其他目录:

/Users/<my user name>/Library/Developer/Xcode/DerivedData/API-cqhjtidcxfuslhhfzzmfwzberuyg/Build/Products/Debug/API.framework/Versions/Frameworks

...但是不能解决SwiftWebSocket框架。接下来的@rpath中包含@loader_path。再次,我要继续进行思考解决,它似乎与@executable_path相同。因此,这将意味着:

/Users/<my user name>/Library/Developer/Xcode/DerivedData/API-cqhjtidcxfuslhhfzzmfwzberuyg/Build/Products/Debug/API.framework/Versions/A/Frameworks

也没有。因此,至少我们已经证明它不在所寻找的位置。 所在的位置位于:

/Users/<my user name>/Library/Developer/Xcode/DerivedData/API-cqhjtidcxfuslhhfzzmfwzberuyg/Build/Products/Debug/SwiftWebSocket-macOS

因此,要查看是否可以启动该应用程序,请将框架复制到'@loader_path/Frameworks'。我需要创建Frameworks文件夹。那行得通,但这不是解决方案。现在,我将创建一个新的@rpath条目,该条目映射到它实际所在的位置:

@loader_path/../../../SwiftWebSocket-macOS

我还为SwiftySound创建了一个同样有问题的

@loader_path/../../../SwiftySound-macOS/

然后... 有效

但是,这是正确的方法吗?我忍不住想到了一个更优雅的解决方案。

0 个答案:

没有答案