【问题标题】:Using CocoaLumberjack in Swift command line tool throws runtime error: dyld: Library not loaded: @rpath/libswiftAppKit.dylib在 Swift 命令行工具中使用 CocoaLumberjack 会引发运行时错误:dyld: Library not loaded: @rpath/libswiftAppKit.dylib
【发布时间】:2021-06-13 17:08:41
【问题描述】:

我有一个用 Swift 编写的命令行工具。我在其他相关的应用程序中使用 Lumberjack,所以我想让它在这个应用程序中工作。命令行工具不导入 AppKit。根据 DDTTYLogger.h 文件,如果定义了 DD_CLI,自定义颜色定义。 (CLIColor.h/m) 是导入的,而不是 AppKit/NSColor.h,所以看来我不应该得到错误。

到目前为止,我已经尝试将 –DDD_CLI 添加到 Swift 编译器,其他 Swift 标志。我还尝试将 CLIColor.m 添加到构建中。我不知所措...有人有这方面的经验,或者有其他可以尝试的方法吗?

感谢您的反馈。

【问题讨论】:

    标签: swift command-line-interface cocoalumberjack


    【解决方案1】:

    我使用在 OS X 10.11.6 上运行的 Xcode 8 beta 遇到了这个问题,虽然我遇到了不同的具体问题,但调试方法对于所有情况相同

    otool 命令可用于准确查看指示链接器查找库文件的位置及其名称。

    对我来说,otool -l {executable_path} 表明它正在寻找 10.12 (Sierra) 中引入的 /System/Library/PrivateFrameworks/swift 中的文件。因为我运行的是 10.11.6,所以这是一个很好的展示。 (以及 Xcode 8 beta 中的一个已知错误)

    查看otool的输出,有两点可以看:

    1. LC_LOAD_DYLIB 命令,显示要包含的库的名称。
      加载命令可能会显示文件的绝对路径,或者可以以 @rpath/ 为前缀,这是用于查找文件的快捷方式。
    2. LC_RPATH 显示以@rpath/ 为前缀的库名称的搜索路径。

    您可以通过在构建设置的Other Linker Flags 字段中包含-rpath {absolute_path_to_files} 来更改LC_RPATH(作为临时解决方法,让您再次编译)。对我来说,这意味着将 rpath 设置为相应 SDK 文件中的库文件,而不是 /System。出于多种原因,这样做充满危险。所以不要忘记撤消它。

    如果您只是遇到构建层次结构的问题,您可以使用更轻松的方法。使用otool,您可以看到实际发生的情况,因此您可以智能地修改Runpath Search Paths 构建设置以跳转一个或两个目录,看看它如何影响链接器的输出。

    【讨论】:

      猜你喜欢
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多