在构建带有相关 Swift 库的 Swift 命令行工具时,为什么要嵌入框架?



我构建了一个简单的 Swift 项目,它生成了一个 macOS 命令行工具,并有一个关联的自定义 Swift 库 (.dylib),但是在编译和运行它时,会出现许多形式的警告:

objc[9532]:类_SwiftNativeNSEnumeratorBase在/Applications/Xcode.app/Content/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftCore.dylib (0x100cca3f0) 和/Users/.../Build/Products/Debug/MyTool (0x1003e84c0) 中实现。将使用两者之一。哪一个是未定义的。

扫描生成的MyTool二进制文件显示它包含该函数,因此我假设它已通过静态链接以某种方式烘焙。.dylib希望它作为一个共享库存在,所以这似乎是重复的来源。

我已经在项目和目标级别尝试了许多设置,但除了显式嵌入选项之外,似乎没有一个控制将核心框架等内容作为静态库嵌入。

对于这两个目标,"始终嵌入 Swift 库">设置为"否"。清理并生成仍会产生重复警告。

看起来必须更改一些事情才能解决此问题:

  • 设置运行时搜索路径以包括/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx或相应的库集。这些似乎包括比默认位置中存在的库更新版本的 Swift 库。
  • 将与标准库的链接设置为"否"。
  • 通过在
  • 命令行目标的"常规"选项卡上手动指定要链接到的库,方法是从.../usr/lib/swift/macos位置拖动这些库。一个 Swift 项目需要libswiftCore.dylib

由于C绑定,我还必须包含libc,但默认的(libc.tbc)就足够了。

最新更新