dyld: Library not loaded: @rpath/libswiftCore.dylib: как победить ошибку

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

«Вжух — и приложение упало»: знакомимся с dyld: Library not loaded: @rpath/libswiftCore.dylib

Вы когда-нибудь запускали своё Swift-приложение, видели красивый сплеш-скрин, а затем — бах! — чёрный экран и консоль, полная красных букв? Знакомо? Если вы хоть раз сталкивались с сообщением dyld: Library not loaded: @rpath/libswiftCore.dylib, то знаете это чувство лёгкой паники. На Stack Overflow этот вопрос собрал тысячи просмотров, и не зря: ошибка коварная, но вполне решаемая.

В этой статье мы не просто дадим сухую инструкцию. Мы разберём, почему Swift-библиотеки «теряются» в рантайме, как этого избежать и что делать, если вы уже вляпались. Поехали!

Что такое dyld и почему он злится?

dyld (dynamic link editor) — это загрузчик динамических библиотек в macOS и iOS. Когда ваше приложение запускается, dyld ищет все необходимые библиотеки по путям, указанным в бинарнике. Один из таких путей — @rpath (runtime search path). Если библиотека (например, libswiftCore.dylib) не найдена по этому пути, dyld падает с ошибкой.

Проще говоря: вы сказали приложению «возьми книгу с полки @rpath», а полка оказалась пуста. Вот и весь детектив.

Почему это происходит именно с libswiftCore.dylib?

libswiftCore.dylib — это ядро Swift runtime. Без него не работает ни один Swift-код. Ошибка чаще всего возникает в трёх случаях:

  • Вы используете Xcode 14+ и проект настроен на старую версию Swift.
  • Подключаете фреймворки или CocoaPods, которые требуют определённую версию Swift runtime.
  • Забыли включить «Always Embed Swift Standard Libraries» в настройках сборки.

5 способов исправить dyld: Library not loaded: @rpath/libswiftCore.dylib

Давайте перейдём к практике. Ниже — проверенные методы, от простого к сложному. Для каждого я приведу пример кода или настроек.

1. Включите «Always Embed Swift Standard Libraries»

Самый частый виновник. Если ваше приложение не встраивает Swift-библиотеки в бандл, dyld не найдёт их на устройстве.

Как исправить:

  1. Откройте проект в Xcode.
  2. Выберите Target → Build Settings.
  3. Найдите Always Embed Swift Standard Libraries.
  4. Установите значение Yes.

Если вы используете CocoaPods, проверьте, что в Podfile нет строки, отключающей это поведение:

# Плохо (может вызвать ошибку)
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'NO'
    end
  end
end

# Хорошо
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'YES'
    end
  end
end

2. Проверьте совместимость Swift-версий

Если вы подключили фреймворк, собранный под Swift 5.7, а ваш проект на Swift 5.5 — привет, ошибка. Swift runtime не обратно совместим «на 100%».

Решение: убедитесь, что все зависимости используют одну версию Swift. Откройте терминал и выполните:

# Узнать версию Swift для конкретного .framework
strings MyFramework.framework/MyFramework | grep "Swift"
# Или проверьте через xcrun
xcrun swift --version

Если фреймворк собран под другую версию — пересоберите его или обновите.

3. Очистите Derived Data и пересоберите проект

Иногда Xcode кэширует старые пути к библиотекам. Полная пересборка часто решает проблему.

# Удаляем Derived Data вручную
rm -rf ~/Library/Developer/Xcode/DerivedData/*

# Или через Xcode: Product → Clean Build Folder (Shift+Cmd+K)

После этого пересоберите проект (Cmd+B) и запустите снова.

4. Настройте @rpath вручную

Если предыдущие шаги не помогли, dyld, возможно, ищет библиотеки не там. Добавьте правильный путь в Build Settings → Runpath Search Paths.

Обычно достаточно:

@executable_path/Frameworks

Но для сложных проектов (например, с вложенными фреймворками) может потребоваться:

@executable_path/Frameworks
@loader_path/Frameworks

Пример настройки в Xcode:

  • Выберите Target → Build Settings.
  • Найдите Runpath Search Paths.
  • Добавьте строку @executable_path/Frameworks.

5. Используйте «Embed & Sign» для всех фреймворков

Проверьте, что все ваши зависимости правильно встроены в бандл. В Xcode перейдите в General → Frameworks, Libraries, and Embedded Content. Убедитесь, что для каждого фреймворка стоит Embed & Sign (или Do Not Embed — если это системная библиотека, но для Swift-фреймворков лучше Embed).

Вот как это выглядит в коде (если вы управляете зависимостями вручную):

// Пример: добавление фреймворка в Copy Files Phase
// Не нужно писать код — просто настройте через Xcode UI

Как избежать ошибки в будущем?

Лучшая борьба с багом — профилактика. Вот три правила, которые уберегут вас от dyld: Library not loaded:

  • Всегда обновляйте Xcode и CocoaPods — новые версии исправляют проблемы с рантаймом.
  • Используйте Swift Package Manager — он лучше управляет зависимостями и версиями Swift.
  • Проверяйте совместимость фреймворков перед добавлением в проект. Особенно если берёте библиотеку с GitHub, собранную «под старым Xcode».

Что делать, если ничего не помогло?

Бывает. Тогда включаем режим детектива:

  1. Запустите приложение с включённым DYLD_PR

Блоги

Рекомендаций по книгам