命令行工具中的框架问题

时间:2019-02-08 00:33:21

标签: swift macos frameworks command-line-tool xcode10.1

在所有人开始向我抛出其他堆栈溢出和论坛帖子之前:我已经全部查看了。他们都没有帮助。

我有一个名为swizzler的简单cmd工具,并希望将SwizzleSrc框架嵌入其中。我已经按照所有的教程进行了学习,并且没有运气而导致堆栈溢出。这就是我得到的。

构建

2019-02-07 19:22:46.785680-0500 Terminal[67444:11837029] flock failed to lock maps file: errno = 35
2019-02-07 19:22:46.786939-0500 Terminal[67444:11837029] flock failed to lock maps file: errno = 35

运行

Last login: Thu Feb  7 19:21:08 on ttys018
NAME-iMac:~ NAME$ /Users/NAME/Library/Developer/Xcode/DerivedData/swizzler-aslysekmorknabdslxbxfaeuiztk/Build/Products/Debug/swizzler ; exit;
dyld: Library not loaded: @rpath/SwizzleSrc.framework/Versions/A/SwizzleSrc
  Referenced from: /Users/NAME/Library/Developer/Xcode/DerivedData/swizzler-aslysekmorknabdslxbxfaeuiztk/Build/Products/Debug/swizzler
  Reason: image not found
Abort trap: 6
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[Process completed]

有人可以帮忙吗?我已经尝试了好几天都无济于事。

1 个答案:

答案 0 :(得分:2)

要解决您的问题,我们需要默认更改Xcode处理Swift 命令行工具目标的方式,特别是针对Swift标准库的链接约定。

我们需要:

  • 在您的Error FS0957 One or more of the declared type parameters for this type extension have a missing or wrong type constraint not matching the original type constraints on '[]<_>'框架中嵌入Swift标准库
  • 强制您的SwizzleSrc命令行可执行文件动态链接所有Swift库
  • 最后,确保您的swizzler可执行文件能够找到所有需要的Swift库(现已放置在框架目标中)

开始吧(假设您使用的是 Xcode 10.1 或更高版本):

将Swift库嵌入框架中

这非常简单。为swizzler框架目标更改以下构建设置

  • 始终将Swift标准库嵌入到

在命令行工具中动态链接所有Swift库

这是一个比较棘手的部分。为SwizzleSrc工具目标添加以下用户定义设置(在 Build Settings 中):

  • swizzler设置为SWIFT_FORCE_DYNAMIC_LINK_STDLIB
  • YES设置为SWIFT_FORCE_STATIC_LINK_STDLIB

(要添加新的用户定义设置,只需点击构建设置标签标题下方的NO按钮。)

这将确保您的命令行可执行文件将动态地 链接所有Swift库(即,默认情况下它们是 static 链接)。顺便说一句,Swift软件包管理器使用这些完全相同的设置来解决相关问题。

更新命令行工具的运行路径

+工具目标添加以下运行路径搜索路径条目(在 Build Settings 中):

  • swizzler
  • @executable_path

现在清理您的构建文件夹,再次两个目标,然后检查是否可以彻底解决您的问题;)

参考

有关更多信息,请确保还检查以下链接:

我还创建了一个(非常!)简单的Xcode项目,展示了上述步骤: