Использование CocoaLumberjack в инструменте командной строки Swift вызывает ошибку времени выполнения: dyld: библиотека не загружена: @rpath/libswiftAppKit.dylib

У меня есть инструмент командной строки, написанный в Swift. Я использую Lumberjack в других связанных приложениях, поэтому я хотел бы заставить его работать в этом. Инструмент командной строки не импортирует AppKit. Согласно файлу DDTTYLogger.h, если определен DD_CLI, пользовательский цвет defs. (CLIColor.h/m) импортируются, а не AppKit/NSColor.h, поэтому кажется, что я не должен получать ошибку.

До сих пор я пытался добавить -DDD_CLI в Swift Compiler, Other Swift Flags. Я также попытался добавить CLIColor.m в сборку. Я в недоумении... У кого-нибудь есть опыт с этим или есть какие-то другие вещи, которые я могу попробовать?

Я ценю ваши отзывы.

Ответ 1

Я столкнулся с этим, используя бета-версию Xcode 8, работающую под OS X 10.11.6, и хотя у меня была специфическая проблема, способ отладки это тот же для всех случаев.

Команда otool может использоваться, чтобы точно определить, где линкеру было предложено искать файлы библиотеки вместе с их именами.

Для меня otool -l {executable_path} показал, что он ищет файлы в /System/Library/PrivateFrameworks/swift, который был введен в 10.12 (Sierra). Поскольку я запускаю 10.11.6, это showstopper. (И известная ошибка в Xcode 8 beta)

Глядя на вывод otool, можно увидеть две вещи:

  • LC_LOAD_DYLIB, которые показывают имена библиотек, которые нужно включить.
    Команда load может показывать абсолютный путь к файлу или может быть префикс с @rpath/, который является ярлыком, используемым для поиска файлов.
  • LC_RPATH, который показывает путь поиска для имен библиотек с префиксом @rpath/.

Вы можете изменить LC_RPATH, включив -rpath {absolute_path_to_files} в поле Other Linker Flags в своих настройках сборки (в качестве временного рабочего процесса, чтобы снова выполнить компиляцию). Для меня это означало установку rpath для файлов библиотеки в соответствующих файлах SDK, а не /System. Делать это чревато опасностью по целому ряду причин. Поэтому не забудьте отменить его.

Вы можете использовать более легкий подход, если у вас есть проблемы с иерархиями построения. Используя otool, вы можете видеть, что на самом деле происходит, поэтому вы можете разумно изменить настройки сборки Runpath Search Paths, чтобы перепрыгнуть через каталог, или два, и посмотреть, как это влияет на вывод компоновщика.