使用关联的 Swift 库构建 Swift 命令行工具时,为什么要嵌入框架?
When building a Swift command-line tool with associated Swift library why is the Framework being embedded?
我构建了一个简单的 Swift 项目,该项目生成 macOS 命令行工具并具有关联的自定义 Swift 库 (.dylib
) 但是在编译和 运行 它有许多警告,形式如下:
objc[9532]: Class _SwiftNativeNSEnumeratorBase is implemented in both /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftCore.dylib (0x100cca3f0) and /Users/.../Build/Products/Debug/MyTool (0x1003e84c0). One of the two will be used. Which one is undefined.
扫描生成的 MyTool
二进制文件显示它包含该函数,所以我假设它是通过静态链接以某种方式嵌入的。 .dylib
期望它作为共享库存在,因此似乎这就是重复出现的地方。
我在项目和目标级别尝试了很多设置,但 none 似乎控制嵌入东西,如核心框架作为静态库,而不是显式嵌入选项。
对于两个目标 始终嵌入 Swift 库 设置为 "No"。清理和构建仍然会产生重复警告。
看来必须更改一些内容才能解决此问题:
- 设置运行时搜索路径以包含
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx
或适当的库集。这些似乎包括 Swift 库的新版本,而不是默认位置中的库。
- 使用标准库将Link设置为"No"。
- 通过将库从
.../usr/lib/swift/macos
位置拖入,在命令行目标的 "General" 选项卡上手动指定要 link 的库。一个 Swift 项目需要 libswiftCore.dylib
.
由于 C 绑定,我还必须包含 libc
,但默认的 (libc.tbc
) 就足够了。
我构建了一个简单的 Swift 项目,该项目生成 macOS 命令行工具并具有关联的自定义 Swift 库 (.dylib
) 但是在编译和 运行 它有许多警告,形式如下:
objc[9532]: Class _SwiftNativeNSEnumeratorBase is implemented in both /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftCore.dylib (0x100cca3f0) and /Users/.../Build/Products/Debug/MyTool (0x1003e84c0). One of the two will be used. Which one is undefined.
扫描生成的 MyTool
二进制文件显示它包含该函数,所以我假设它是通过静态链接以某种方式嵌入的。 .dylib
期望它作为共享库存在,因此似乎这就是重复出现的地方。
我在项目和目标级别尝试了很多设置,但 none 似乎控制嵌入东西,如核心框架作为静态库,而不是显式嵌入选项。
对于两个目标 始终嵌入 Swift 库 设置为 "No"。清理和构建仍然会产生重复警告。
看来必须更改一些内容才能解决此问题:
- 设置运行时搜索路径以包含
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx
或适当的库集。这些似乎包括 Swift 库的新版本,而不是默认位置中的库。 - 使用标准库将Link设置为"No"。
- 通过将库从
.../usr/lib/swift/macos
位置拖入,在命令行目标的 "General" 选项卡上手动指定要 link 的库。一个 Swift 项目需要libswiftCore.dylib
.
由于 C 绑定,我还必须包含 libc
,但默认的 (libc.tbc
) 就足够了。