Ответ 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
, чтобы перепрыгнуть через каталог, или два, и посмотреть, как это влияет на вывод компоновщика.