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

Posted

技术标签:

【中文标题】在构建带有关联 Swift 库的 Swift 命令行工具时,为啥要嵌入框架?【英文标题】:When building a Swift command-line tool with associated Swift library why is the Framework being embedded?在构建带有关联 Swift 库的 Swift 命令行工具时,为什么要嵌入框架? 【发布时间】:2017-05-24 21:11:40 【问题描述】:

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

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

扫描生成的MyTool 二进制文件显示它包含该函数,所以我假设它已通过静态链接以某种方式被烘焙。 .dylib 期望它以共享库的形式出现,所以这似乎就是重复出现的地方。

我在项目和目标级别尝试了许多设置,但除了显式嵌入选项之外,似乎没有一个可以控制将核心框架之类的东西嵌入为静态库。

对于这两个目标,始终嵌入 Swift 库 设置为“否”。清理和构建仍然会产生重复警告。

【问题讨论】:

【参考方案1】:

看起来有一些事情需要改变才能解决这个问题:

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

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

【讨论】:

以上是关于在构建带有关联 Swift 库的 Swift 命令行工具时,为啥要嵌入框架?的主要内容,如果未能解决你的问题,请参考以下文章

带有嵌入库的 Cocoa Touch Framework Swift

带有静态库的私有 pod 以及 swift pod

Objective-C 库的 Swift “使用未声明的类型”

Objective-C 库的 Swift “使用未声明的类型”

带有发布构建设置的 Swift 动画完成错误

带有不安全构建标志的 Swift 包依赖项:目标完整性错误