«Вжух — и приложение упало»: знакомимся с 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 не найдёт их на устройстве.
Как исправить:
- Откройте проект в Xcode.
- Выберите Target → Build Settings.
- Найдите
Always Embed Swift Standard Libraries. - Установите значение
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».
Что делать, если ничего не помогло?
Бывает. Тогда включаем режим детектива:
- Запустите приложение с включённым DYLD_PR