我正在迁移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
搜寻了各种资源之后,我认为我可以找到一个解决方案。没运气。这是我尝试的失败的尝试:
ld: framework not found SwiftWebSocket
” 值得指出的是,我的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/
然后... 有效
但是,这是正确的方法吗?我忍不住想到了一个更优雅的解决方案。