Avatar ·

Ошибка dyld: Library not loaded: @rpath/libswiftCore.dylib при запуске iOS приложения

Всем привет! Я начинающий iOS разработчик, пишу свое первое приложение на Swift. Использую Xcode 14, проект создавал с нуля, стандартный шаблон Single View App. Все собиралось и запускалось нормально, но после того как я добавил пару сторонних библиотек через CocoaPods (Alamofire и SwiftyJSON), при запуске на симуляторе iPhone 14 Pro (iOS 16.2) вылетает ошибка: dyld: Library not loaded: @rpath/libswiftCore.dylib Referenced from: /Users/username/Library/Developer/CoreSimulator/Devices/.../.../MyApp.app/Frameworks/libswiftCore.dylib Reason: no suitable image found. Did find: /Users/username/Library/Developer/CoreSimulator/Devices/.../.../MyApp.app/Frameworks/libswiftCore.dylib: mmap() error 1 at address=0x..., size=0x... segment=__TEXT with unix errno=1 (Unknown error: 0) Приложение открывается, показывает белый экран на секунду и падает. Вот мой Podfile: platform :ios, '15.0' target 'MyApp' do use_frameworks! pod 'Alamofire', '~> 5.6' pod 'SwiftyJSON', '~> 5.0' end Пробовал чистить Derived Data, удалять Pods и Podfile.lock, делать pod install заново — не помогает. В Build Settings у проекта стоит Always Embed Swift Standard Libraries = Yes. В чем может быть проблема и как это исправить? <<>>

Причина ошибки

Ошибка dyld: Library not loaded: @rpath/libswiftCore.dylib возникает, когда динамический линковщик (dyld) не может найти или загрузить стандартную библиотеку Swift во время запуска приложения. Это часто случается при использовании CocoaPods с флагом use_frameworks!, когда поды собираются как динамические фреймворки, а пути поиска библиотек Swift настроены некорректно.

Основное решение — проверка настроек Always Embed Swift Standard Libraries

Несмотря на то что вы установили Always Embed Swift Standard Libraries = Yes для основного таргета, CocoaPods может переопределить эту настройку для своих таргетов. Выполните следующие шаги:

  1. Откройте проект в Xcode и выберите корневой элемент в навигаторе проектов.
  2. Выберите ваш основной таргет (MyApp) → вкладка Build Settings → найдите Always Embed Swift Standard Libraries.
  3. Убедитесь, что для Debug и Release стоит Yes.
  4. Нажмите на кнопку + слева от настройки и выберите Add User-Defined Setting.
  5. Введите имя ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES и установите значение YES для всех конфигураций.

Если это не помогло, проверьте настройки для Pods-таргета:

  1. В том же окне выберите Pods → Pods-MyApp (или Pods-MyApp если у вас несколько таргетов).
  2. Найдите Always Embed Swift Standard Libraries и установите Yes.

Альтернативное решение — проверка Runpath Search Paths

Иногда проблема в том, что @rpath не указывает на правильную директорию. Проверьте настройку Runpath Search Paths в вашем основном таргете:

@executable_path/Frameworks
@loader_path/Frameworks

Добавьте эти пути, если их нет. Для Pods-таргета аналогично.

Решение для CocoaPods — использование static_framework

Если вы не используете динамические фреймворки от сторонних библиотек, можно переключить поды на статическую линковку. В Podfile замените:

use_frameworks!
на
use_frameworks! :linkage => :static

Или для отдельных подов:

pod 'Alamofire', '~> 5.6', :linkage => :static

После этого выполните pod install и перезапустите Xcode.

Чистка кэша и пересборка

Иногда помогает полная чистка:

  1. Закройте Xcode.
  2. Удалите папки DerivedData (~/Library/Developer/Xcode/DerivedData).
  3. Удалите папку Pods и файл Podfile.lock.
  4. Выполните pod deintegrate и затем pod install.
  5. Откройте .xcworkspace и попробуйте запустить.

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

Убедитесь, что версии Alamofire и SwiftyJSON совместимы с вашей версией Swift и iOS. Например, Alamofire 5.6 требует Swift 5.0+ и iOS 13+. Если ваш проект настроен на iOS 15.0 — это должно работать, но проверьте в Podfile:

platform :ios, '15.0'

Иногда ошибка возникает из-за несоответствия deployment target у подов — они могут быть настроены на более старую iOS.

После всех изменений обязательно делайте Clean Build Folder (Product → Clean Build Folder, или ⌘⇧K) и перезапускайте симулятор.

<<>>

Альтернативный подход — использование SPM вместо CocoaPods

Если вы только начинаете и проблема с CocoaPods вызывает много головной боли, рекомендую перейти на Swift Package Manager (SPM), который встроен в Xcode начиная с версии 11. SPM реже вызывает проблемы с линковкой Swift библиотек, так как лучше интегрирован в экосистему.

Как перейти:

  1. Удалите CocoaPods: pod deintegrate и удалите файлы Pods, Podfile, Podfile.lock и .xcworkspace.
  2. Откройте .xcodeproj в Xcode.
  3. Перейдите в File → Add Packages…
  4. Вставьте URL репозитория Alamofire: https://github.com/Alamofire/Alamofire.git и выберите версию.
  5. Аналогично для SwiftyJSON: https://github.com/SwiftyJSON/SwiftyJSON.git.
  6. Нажмите Add Package и выберите ваш основной таргет.

После этого ошибка libswiftCore.dylib обычно исчезает, так как SPM автоматически настраивает все пути и флаги линковки. Единственный минус — некоторые старые библиотеки могут не поддерживать SPM, но для Alamofire и SwiftyJSON поддержка есть.

Если вы не хотите полностью отказываться от 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'] = 'YES'
    end
  end
end

Этот хук принудительно устанавливает нужную настройку для всех Pods-таргетов.