【问题标题】:Static Linking with Swift, XCode6-Beta [duplicate]使用 Swift 进行静态链接,XCode6-Beta [重复]
【发布时间】:2014-07-25 08:53:34
【问题描述】:

我一直在尝试将 Obj-C 库移植到 Swift,但遇到了一个问题,即当项目中有 Swift 代码时,链接器无法构建静态库。

作为最小复制器,进入 XCode6 并创建一个新的 iOS 静态库。它会给你一个带有空白 .h 和 .m 文件的项目。这将编译得很好。然后,将一个新的 .swift 文件添加到项目中(无论是否创建头桥)。这也应该编译得很好,但是在链接过程中却失败了:

Libtool /Users/alexkarantza/Library/Developer/Xcode/DerivedData/Test-alenfoymgkewlghfjjvizjjuvign/Build/Products/Debug-iphonesimulator/libTest.a normal i386
    cd /Users/alexkarantza/Workspace/Test
    export IPHONEOS_DEPLOYMENT_TARGET=8.0
    export PATH="/Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode6-Beta.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool -static -arch_only i386 -syslibroot /Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk -L/Users/alexkarantza/Library/Developer/Xcode/DerivedData/Test-alenfoymgkewlghfjjvizjjuvign/Build/Products/Debug-iphonesimulator -filelist /Users/alexkarantza/Library/Developer/Xcode/DerivedData/Test-alenfoymgkewlghfjjvizjjuvign/Build/Intermediates/Test.build/Debug-iphonesimulator/Test.build/Objects-normal/i386/Test.LinkFileList -ObjC -L/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator -Xlinker -rpath -Xlinker /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator -Xlinker -force_load -Xlinker /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a -Xlinker -sectalign -Xlinker __SWIFT -Xlinker __ast -Xlinker 4 -Xlinker -sectcreate -Xlinker __SWIFT -Xlinker __ast -Xlinker /Users/alexkarantza/Library/Developer/Xcode/DerivedData/Test-alenfoymgkewlghfjjvizjjuvign/Build/Intermediates/Test.build/Debug-iphonesimulator/Test.build/Objects-normal/i386/Test.swiftmodule -o /Users/alexkarantza/Library/Developer/Xcode/DerivedData/Test-alenfoymgkewlghfjjvizjjuvign/Build/Products/Debug-iphonesimulator/libTest.a

error: /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: unknown option character `X' in: -Xlinker
Usage: /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool -static [-] file [...] [-filelist listfile[,dirname]] [-arch_only arch] [-sacLT] [-no_warning_for_no_symbols]
Usage: /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool -dynamic [-] file [...] [-filelist listfile[,dirname]] [-arch_only arch] [-o output] [-install_name name] [-compatibility_version #] [-current_version #] [-seg1addr 0x#] [-segs_read_only_addr 0x#] [-segs_read_write_addr 0x#] [-seg_addr_table <filename>] [-seg_addr_table_filename <file_system_path>] [-all_load] [-noall_load]

如果我以模拟器或设备为目标,就会发生这种情况。看起来项目中的 Swift 文件可能会导致它使用通常为可执行文件保留的链接器选项,即使目标是静态库?我对构建选项知之甚少,无法知道这是测试版中的错误,还是我应该配置的某个选项。在这样一个微不足道的例子中,构建是否会合法地失败似乎值得怀疑。有什么想法吗?

【问题讨论】:

  • 请看this post
  • 2014 年 6 月 4 日 15:47 提出的问题和 2014 年 6 月 4 日 20:23 上次编辑的问题如何与 15 年 4 月 16 日 13:37 提出的问题重复?

标签: ios swift xcode6


【解决方案1】:

在 cmets 中进行一些讨论后回答我自己的问题,目前还无法构建包含 Swift 代码的静态库。我从 Beta 4 开始写这篇文章,发行说明仍然说,在“Xcode 6 beta 4 中的已知问题”下:

Xcode 不支持构建包含 Swift 代码的静态库。 (17181019)

【讨论】:

  • 使用Cocoa Touch Framework,而不是Cocoa Touch Static Library。苹果正朝着这个方向前进。
  • @SwiftArchitect - 从 xcode 8 开始,有什么方法可以从 Swift 代码创建静态库?
  • 。请参阅 Apple Staff2017 年 3 月 10 日下午 2:41 Can we create a static library using Swift files 发布的回复
【解决方案2】:

我也一直在研究这个问题,这是我发现的:

首先,在 Xcode 6 Beta 中,创建 Cocoa Touch 静态库时没有语言选择,语言默认设置为 Objective-C,虽然你可以将 Swift 文件添加到项目中,但它会出现错误,就像你的结果问。我的解释是,Apple 的意图是避免创建 Swift 静态库。

因此,如果您打算构建一个利用 Swift 强大功能的库,请使用 Cocoa Touch Framework 而不是静态库。我写了创建框架项目和应用项目的步骤,你可以找到它here注意 在该示例中,我创建了一个 Objective-C 框架项目。如果想要纯 Swift 框架项目,请选择 Language Swift

另请注意,如果您希望将 Swift 框架导入到 Objective-C 项目中,或者混合使用多种语言,请在此处阅读Swift and Objective-C in the Same Project

希望这会给你一个好的方向。

【讨论】:

  • 这可能是一个很好的解决方法,但在我的特殊情况下,我正在编写一个库供 iOS 上的 Xamarin 应用程序使用,而静态库是唯一的选择。
  • 要记住的一件事。据我所知,没有办法将 CocoaPod 包与 Swift 框架项目一起使用。否则它会起作用!
  • Touch Frameworks 的唯一问题是您无法为 iOS7 部署最终产品。 iOS8 之前不支持 dylib 的警告。当您运行应用程序时,它会崩溃......说无法加载 dylib。
【解决方案3】:

看看这个威胁XCode5 simulator: unknown option character `X' in: -Xlinker

为了了解错误,您必须了解 命令正在尝试执行。

在这种情况下,它使用的是 Libtool,这是一个稍微改动过的版本 的 libtool。命令中指定了一些选项 行,但我们正在寻找的是目标文件,这是 作为 -o 选项传入,谁的参数是 /Users/jr/ios/app/iCozi/build/DevOnly-iphonesimulator/libCozi\ Common\ Code.a,以及我们正在生成的库的类型,在这种情况下 它是静态的。两个选项一起明确声明您是 制作静态库存档。

因为您正在制作一个静态库存档,所以您唯一要做的就是 实际上正在做的是获取 .o 文件,可能还有 .a 文件并转 将它们放入另一个 .a 文件中。这可以大致等同于创建 来自一组文件 (.o) 的 .zip 文件,以及其他文件的内容 .zip 文件 (.a)。在制作过程中您可以做的事情很少 这个档案,例如你不能指定需要的库 在构建静态存档时隐式链接,您不能指定 您将需要权利。

libtool 抱怨,因为它不理解 正在用于正在传入的静态库。在这个 如果选项是:

-Xlinker -sectcreate -Xlinker __TEXT -Xlinker __entitlements -Xlinker /Users/jr/ios/app/iCozi/build/iCozi.build/DevOnly-iphonesimulator/Cozi\ Common\ Code.build/Cozi\ Common\ Code.xcent

这些是您尝试链接时出现的选项 权利文件,这意味着某些选项正在指定使用 的权利文件。在这种情况下,您找到了正确的解决方案 你自己,这是删除指定的权利文件 项目设置 -> 代码签名 -> 代码签名权利 -> DevOnly。

【讨论】:

  • 在项目设置下不适合我 -> 代码签名 -> 代码签名权利我什么都没有,即使放 DevOnly 也不会改变错误:(
  • 在问之前我也读过;我所知道的所有选项集都不会导致它添加那些 Xlinker 参数。我的猜测是,它是一些硬编码到 xcode 中的选项,用于构建尚未暴露给构建设置对话框的 Swift 文件。
  • 我只是向苹果报告了这个错误,请也这样做bugreport.apple.com
  • Beta 2 已经发布,但对我来说同样的错误...您在您的项目中解决了这个问题吗?
  • 在 Xcode Beta 2 发行说明中,在已知错误下,它说“在此版本中无法构建包含 Swift 代码的静态库。(17181019)”。所以至少他们知道这一点,我猜。
【解决方案4】:

【讨论】:

    【解决方案5】:

    我遇到了同样的问题,我确实找到了解决方案。 'libtool' 由于 -Xlinker 属性而失败,该属性试图指定 Swift 模块 - 静态库似乎不支持。 (我也认为这是苹果的错误/缺陷,但也许这是另一个线程的讨论)

    我所做的是将整个 libtool 命令复制/粘贴到终端,删除所有“-XLinker ...”参数,并令人惊讶地从命令行构建成功。

    我的静态库项目包括 Objective-C 和 Swift 源代码,它们都被“打包”到生成的静态库中!

    唯一的缺点是没有生成 Swift 模块,但在我的情况下这并不重要,因为 Swift 仅在内部使用 - 我只有 Objective C 外部接口。

    我认为也可以通过沿生成的静态库复制生成的静态库桥接头来公开 Swift“接口”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      相关资源
      最近更新 更多