【问题标题】: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的输出,有两点可以看:
-
LC_LOAD_DYLIB 命令,显示要包含的库的名称。
加载命令可能会显示文件的绝对路径,或者可以以 @rpath/ 为前缀,这是用于查找文件的快捷方式。
-
LC_RPATH 显示以@rpath/ 为前缀的库名称的搜索路径。
您可以通过在构建设置的Other Linker Flags 字段中包含-rpath {absolute_path_to_files} 来更改LC_RPATH(作为临时解决方法,让您再次编译)。对我来说,这意味着将 rpath 设置为相应 SDK 文件中的库文件,而不是 /System。出于多种原因,这样做充满危险。所以不要忘记撤消它。
如果您只是遇到构建层次结构的问题,您可以使用更轻松的方法。使用otool,您可以看到实际发生的情况,因此您可以智能地修改Runpath Search Paths 构建设置以跳转一个或两个目录,看看它如何影响链接器的输出。