无法将动态框架添加到命令行工具
Can't add dynamic frameworks to Command Line Tool
目标
我将命令行工具目标添加到 iOS 应用程序并 link 使用 swift 框架编辑。 (用 Realm
和 SwiftyJSON
测试)
预期结果
使用这些库构建命令行工具。
实际结果
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 领域框架
代码示例
框架和工具的版本
领域版本:github "realm/realm-cocoa" "master"
SwiftyJSON 版本:github "acegreen/SwiftyJSON" "swift3"
Xcode 版本:8 GM(在 App Store 上)
依赖管理器 + 版本:Carthage 0.18
命令行工具最适合静态存档,因为所有内容都作为单个二进制文件分发。查看 Realm,我没有看到有静态存档选项。他们确实有一个我为 macOS 编译的 iOS 静态框架,但这并不是你想要的。您可能想多尝试使用 Realm 的源代码,看看是否可以生成静态存档。
同时,作为 解决方法,您需要告诉 Xcode 在运行时在哪里可以找到 dylib,并将它们安装在某个地方。
- 在您的构建设置中,转到 "Runpath Search Paths" 并添加“
@rpath
”。
- 在构建阶段的复制文件下,单击 + 按钮并从您的项目中添加 Realm.framework 和 RealmSwift.framework。
- 因为Realm是用老版本的Swift编译的,你还需要在Build Settings中指定"Use Legacy Swift Language Version"。
这将使您的项目构建并找到 Realm 库,但现在找不到 libswiftCore.dylib。那是因为通常命令行工具与 Swift 库静态链接,但只要您添加 framework/dylib,链接器就不再包含静态版本。
- 返回构建阶段,复制文件,并添加以下内容:
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 的静态存档版本,则可以将所有内容分发到一个二进制文件中。
目标
我将命令行工具目标添加到 iOS 应用程序并 link 使用 swift 框架编辑。 (用 Realm
和 SwiftyJSON
测试)
预期结果
使用这些库构建命令行工具。
实际结果
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 领域框架
代码示例
框架和工具的版本
领域版本:github "realm/realm-cocoa" "master"
SwiftyJSON 版本:github "acegreen/SwiftyJSON" "swift3"
Xcode 版本:8 GM(在 App Store 上)
依赖管理器 + 版本:Carthage 0.18
命令行工具最适合静态存档,因为所有内容都作为单个二进制文件分发。查看 Realm,我没有看到有静态存档选项。他们确实有一个我为 macOS 编译的 iOS 静态框架,但这并不是你想要的。您可能想多尝试使用 Realm 的源代码,看看是否可以生成静态存档。
同时,作为 解决方法,您需要告诉 Xcode 在运行时在哪里可以找到 dylib,并将它们安装在某个地方。
- 在您的构建设置中,转到 "Runpath Search Paths" 并添加“
@rpath
”。 - 在构建阶段的复制文件下,单击 + 按钮并从您的项目中添加 Realm.framework 和 RealmSwift.framework。
- 因为Realm是用老版本的Swift编译的,你还需要在Build Settings中指定"Use Legacy Swift Language Version"。
这将使您的项目构建并找到 Realm 库,但现在找不到 libswiftCore.dylib。那是因为通常命令行工具与 Swift 库静态链接,但只要您添加 framework/dylib,链接器就不再包含静态版本。
- 返回构建阶段,复制文件,并添加以下内容:
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 的静态存档版本,则可以将所有内容分发到一个二进制文件中。