"Copy swift standard libraries" 构建步骤不包括 SwiftOnoneSupport.dylib

"Copy swift standard libraries" build step does not include SwiftOnoneSupport.dylib

我最近遇到了一个令人不安的问题,它与项目的 运行 测试有关,该项目具有 cocoapods 对框架的依赖性,该框架在运行时崩溃并出现错误:

Library not loaded: @rpath/libswiftSwiftOnoneSupport.dylib Referenced from: MyCocoapodsDependency

还有其他关于该特定问题的 Whosebug 主题,但其中 none 解决了根本原因(例如 ),即在 "Copy swift standard libraries" 步骤中测试构建,缺少的库没有被复制过来。

看起来像这样(这是我构建测试时的构建日志):

什么时候应该看起来像这样(这是使用完全相同的依赖项的测试应用程序的构建日志):

OnOneSupport 似乎与 "Whole module optimization".

相关的项目设置有关

但即使我更改为 "not onOne" 也没有什么不同。 https://github.com/apple/swift/blob/master/cmake/modules/AddSwift.cmake

中引用了 dylib

我一辈子都弄不明白为什么它在标准库构建步骤中被一个目标而不是另一个目标省略,但很明显我的测试需要它。有人知道我如何强制编译器包含 SwiftOnoneSupport?

解决方法

向测试目标(在项目文件中)添加构建阶段,将 libswiftSwiftOnoneSupport.dylib 复制到框架。 dylib 可以在以下位置找到:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/bitcode_strip /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/libswiftSwiftOnoneSupport.dylib

我的两个框架也有同样的问题。最奇怪的是,其中一个一切正常,但另一个却不行。

虽然我无法弄清楚为什么会发生这种情况(因为它似乎是 Xcode bug),但我找到了一个非常巧妙的解决方法。

事实证明,在代码中的任何地方使用 print() 都会以某种方式强制加载 libswiftSwiftOnoneSupport.dylib。所以,通过添加这样的东西,问题应该消失了:

private func dummy() { 
    print("Hello world!") 
}

我正在使用 Xcode 10.1、Swift 4.2,给我这个问题的 pod 是 Nimble。

希望对您有所帮助!