Kev*_*non 4 xcode dynamic-linking static-linking mac-frameworks swift
我正在尝试在 Mac OS X 的 Swift 应用程序中使用外部框架。外部框架也使用 Swift,因此依赖于 Swift 共享库(例如,libswiftCore.dylib)。这是通过命令验证的
$ otool -L PromiseKit.framework/PromiseKit
PromiseKit.framework/PromiseKit:
...
@rpath/libswiftCore.dylib (compatibility version 0.0.0, current version 0.0.0)
Run Code Online (Sandbox Code Playgroud)
抬头@rpath看见
$ otool -l PromiseKit.framework/PromiseKit
...
cmd LC_RPATH
cmdsize 40
path @executable_path/Frameworks (offset 12)
Run Code Online (Sandbox Code Playgroud)
所以在运行时我希望@rpath解决@executable_path/Frameworks
我收到运行时错误
$ otool -l PromiseKit.framework/PromiseKit
...
cmd LC_RPATH
cmdsize 40
path @executable_path/Frameworks (offset 12)
Run Code Online (Sandbox Code Playgroud)
查看包含我构建的可执行文件的文件夹,我没有看到Frameworks文件夹。
我尝试设置EMBEDDED_CONTENT_CONTAINS_SWIFT到YES我的应用程序,但是这仍然不能创建Frameworks文件夹。
我尝试手动创建Frameworks文件夹并在 Swift 共享库中复制(从/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx. 这修复了原始错误,但现在我看到重复的符号预热,如下所示:
dyld: Library not loaded: @rpath/libswiftCore.dylib
Referenced from: .../PromiseKit.framework/Versions/A/PromiseKit
Reason: image not found
Run Code Online (Sandbox Code Playgroud)
Swift 库是否有可能静态链接到我的应用程序中?如果是这样,我该如何关闭它并让 XCode 创建Frameworks文件夹版本?
我认为重要的一点是它是一个命令行应用程序。我尝试创建一个常规应用程序并添加框架,我
Frameworks在我的.app包中得到了预期的文件夹,它包含 Swift 共享库
小智 5
我可以得到一个 swift 命令行工具,无论是否有外部框架工作,只要:
要获得一个框架来复制 swift 库,请设置:
"Embedded Content Contains Swift Code" = Yes
Run Code Online (Sandbox Code Playgroud)
为了避免在工具尝试将 swift 库复制到其不存在的 Bundle Frameworks 目录时构建失败,请设置:
"Embedded Content Contains Swift Code" = Yes
Run Code Online (Sandbox Code Playgroud)
要配置工具的运行路径,请将以下内容之一添加到 LD_RUNPATH_SEARCH_PATHS:
A. 外部框架中的 swift 库:
@executable_path/PromiseKit.framework/Versions/A/Frameworks
Run Code Online (Sandbox Code Playgroud)
请注意,默认情况下,Xcode 不会将 Versions/A/Frameworks 符号链接到 Frameworks,就像它对 Resources、Headers 和 Modules 所做的那样。
B. Xcode 应用程序中的 swift 库:
$(DEVELOPER_DIR)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx
Run Code Online (Sandbox Code Playgroud)
这仅适用于安装在可执行文件需要运行的每台机器上的足够相似的 Xcode。但是它不需要外部框架来使工具工作。
C. 将 swift 库重新分发到与可执行文件相同的目录中:
@executable_path
Run Code Online (Sandbox Code Playgroud)
或者,如果可执行文件位于 bin/ 目录中,而库位于 lib/ 目录中:
@executable_path/../lib
Run Code Online (Sandbox Code Playgroud)
这可以重新分发,并且不需要外部框架来使工具工作。但是它需要在 Xcode 中手动复制文件阶段才能以这种方式设置目录结构。
请注意,如果该工具配置为:
"Embedded Content Contains Swift Code" = Yes
Run Code Online (Sandbox Code Playgroud)
Xcode 抛出以下构建错误:
2015-06-04 00:56:28.816 swift-stdlib-tool[5208:2453424] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSFileManager copyItemAtPath:toPath:error:]: destination path is nil'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff8ee4503c __exceptionPreprocess + 172
1 libobjc.A.dylib 0x00007fff89f1c76e objc_exception_throw + 43
2 CoreFoundation 0x00007fff8ee44eed +[NSException raise:format:] + 205
3 Foundation 0x00007fff926569b7 -[NSFileManager copyItemAtPath:toPath:error:] + 185
4 swift-stdlib-tool 0x000000010526b485 _Z13copyLibrariesP8NSStringS0_P19NSMutableDictionary + 853
5 swift-stdlib-tool 0x000000010526c60b main + 3915
6 libdyld.dylib 0x00007fff97d785c9 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
Copying libswiftCore.dylib from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx to (null)
Run Code Online (Sandbox Code Playgroud)