“复制Swift标准库”构建步骤不包括SwiftOnoneSupport.dylib

时间:2018-12-04 03:05:44

标签: swift build cocoapods standard-library

最近,我一直在遇到一个麻烦的问题,该问题与在一个项目上运行测试有关,该项目对一个框架有cocoapods依赖性,该框架在运行时因错误而崩溃:

  

未加载库:@ rpath / libswiftSwiftOnoneSupport.dylib   引用自:MyCocoapodsDependency

还有其他关于该特定问题的stackoverflow主题,但是它们都没有解决根本原因(例如here),即在测试版本的“复制快速标准库”步骤中,缺少库未复制。

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

missing dylib

看起来应该是这样(这是使用完全相同的依赖项的测试应用的构建日志):

enter image description here

OnOneSupport似乎与“整个模块优化”有关的项目设置有关。

enter image description here

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

中被引用

我无法终生弄清楚为什么在标准库构建步骤中为一个目标而不是另一个目标省略了它,但是很明显我的测试需要它。有人知道我可以如何强制编译器包括SwiftOnoneSupport吗?

解决方法

将构建阶段添加到测试目标(在项目文件中),该阶段将libswiftSwiftOnoneSupport.dylib复制到Frameworks。 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

enter image description here

1 个答案:

答案 0 :(得分:2)

我的两个框架也遇到了同样的问题。最奇怪的是,其中任何一个都可以正常运行,而另一个则不能正常运行。

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

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

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

我正在使用Xcode 10.1,Swift 4.2,而给我带来此问题的pod是Nimble。

希望这会有所帮助!