无法将动态框架添加到命令行工具

Can't add dynamic frameworks to Command Line Tool

目标

我将命令行工具目标添加到 iOS 应用程序并 link 使用 swift 框架编辑。 (用 RealmSwiftyJSON 测试)

预期结果

使用这些库构建命令行工具。

实际结果

Xcode 输出: dyld: Library not loaded: @rpath/libswiftCore.dylib Referenced from: .../Xcode/DerivedData/.../Build/Products/Debug/RealmSwift.framework/Versions/A/RealmSwift Reason: Incompatible library version: RealmSwift requires version 1.0.0 or later, but libswiftCore.dylib provides version 0.0.0

重现步骤

创建空 Swift 命令行工具和 link 领域框架

代码示例

CommandLineTest.zip

框架和工具的版本

领域版本:github "realm/realm-cocoa" "master" SwiftyJSON 版本:github "acegreen/SwiftyJSON" "swift3"

Xcode 版本:8 GM(在 App Store 上)

依赖管理器 + 版本:Carthage 0.18

命令行工具最适合静态存档,因为所有内容都作为单个二进制文件分发。查看 Realm,我没有看到有静态存档选项。他们确实有一个我为 macOS 编译的 iOS 静态框架,但这并不是你想要的。您可能想多尝试使用 Realm 的源代码,看看是否可以生成静态存档。

同时,作为 解决方法,您需要告诉 Xcode 在运行时在哪里可以找到 dylib,并将它们安装在某个地方。

  1. 在您的构建设置中,转到 "Runpath Search Paths" 并添加“@rpath”。
  2. 在构建阶段的复制文件下,​​单击 + 按钮并从您的项目中添加 Realm.framework 和 RealmSwift.framework。
  3. 因为Realm是用老版本的Swift编译的,你还需要在Build Settings中指定"Use Legacy Swift Language Version"。

这将使您的项目构建并找到 Realm 库,但现在找不到 libswiftCore.dylib。那是因为通常命令行工具与 Swift 库静态链接,但只要您添加 framework/dylib,链接器就不再包含静态版本。

  1. 返回构建阶段,复制文件,并添加以下内容:
libswiftObjectiveC.dylib
libswiftIOKit.dylib
libswiftFoundation.dylib
libswiftDispatch.dylib
libswiftDarwin.dylib
libswiftCoreGraphics.dylib
libswiftCore.dylib

您可以在 Xcode 安装中找到它们,然后 ./Contents/Developer/Toolchains/Swift_2.3.xctoolchain/usr/lib/swift/macosx/

警告:请记住,您需要使用命令行工具分发框架和动态库,并且它们需要与工具位于同一目录中.您可以通过指定不同的运行路径将它们放在系统的其他位置,但您仍然需要将它们与您的工具一起分发。

.app 包的好处在于它为您提供了放置这些东西的地方,用户只需拖放它即可安装。如果您可以获得 Realm 的静态存档版本,则可以将所有内容分发到一个二进制文件中。