Модуль, скомпилированный с помощью Swift 5.1, не может быть импортирован компилятором Swift 5.1.2.

У меня есть фреймворк (в данном случае RxSwift), который я скомпилировал с помощью Xcode 11.0 в традиционный RxSwift.framework пакет стилей

Это импортировано в Xcode 11.0, а также в 11.1 никогда не было проблем с ним.

Сегодня, когда Apple выпустила Xcode 11.2, я обновился и получил сообщение об ошибке:

Модуль, скомпилированный с помощью Swift 5.1, не может быть импортирован компилятором Swift 5.1.2.

Я привык к быстрым несоответствиям компилятора, и я знаю, что могу просто перекомпилировать RxSwift с помощью Xcode 11.2 и продолжить, но главной особенностью Swift 5.1 была стабильность модуля.

У меня сложилось впечатление, что теперь, когда у нас есть стабильность модулей, фреймворки не нужно будет перекомпилировать с каждым новым выпуском Xcode, но это явно не так.

Если кто-нибудь может объяснить, что здесь происходит, я был бы очень признателен. Xcode 11.2 обнаруживает ошибку? или мне как-то нужно было сказать, что мне нужна стабильность модуля, когда я изначально компилировал с Xcode 11.0?

13 ответов

Решение

Хорошо, оказывается, если вы посмотрите видео WWDC, они объяснят это:https://developer.apple.com/videos/play/wwdc2019/416/

Вам необходимо установить для параметра Build Libraries for Distribution значение Yes в настройках сборки вашего фреймворка, иначе компилятор Swift не сгенерирует необходимые.swiftinterface файлы, которые являются ключом к тому, чтобы будущие компиляторы могли загружать вашу старую библиотеку.

Это заканчивается в вашем файле project.pbxproj как:

BUILD_LIBRARY_FOR_DISTRIBUTION = YES;

После установки этого флага фреймворк, который я скомпилировал с использованием Xcode 11.0 (swift 5.1), мог использоваться Xcode 11.2 (swift 5.1.2), и все, похоже, работает правильно.

Надеюсь, этот вопрос / ответ послужит полезным справочником для всех, кто не смотрел все видео WWDC.

Если еще ошибка сохраняется перейти к продукту > Очистить папку сборки и выпуска снова.

[ABI]

Swift v5.0 представил стабильный ABI

Swift v5.1 отправлен Module stability а также Library evolution support которые применимы для фреймворка (или библиотеки) с закрытым исходным кодом (фреймворк создается отдельно от потребителя)

Чтобы включить его, вы должны использовать Xcode v11 и

Select framework target -> Build Settings -> Build Libraries for Distribution (BUILD_LIBRARY_FOR_DISTRIBUTION) -> Yes

Этот параметр создает .swiftinterface в .framework/Modules/.swiftmodule. Это альтернатива Swift для Objective-C..h. Это выглядит как:

// swift-interface-format-version: 1.0
// swift-compiler-version: Apple Swift version 5.2.4 (swiftlang-1103.0.32.9 clang-1103.0.32.53)
// swift-module-flags: -target x86_64-apple-ios12.2-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -Onone -module-name UtilsSwiftFramework
import Foundation
import Swift
@_exported import UtilsSwiftFramework
@_inheritsConvenienceInitializers @objc public class GFISClassA : ObjectiveC.NSObject {
  @objc public static var shared: UtilsSwiftFramework.GFISClassA
  @objc public func GFISprintHelloWorld()
  @objc public func GFISprintHelloWorld(arg1: Swift.String, arg2: Swift.String)
  @objc deinit
  @objc override dynamic public init()
}

*Вы можете получить Marking non-'@objc' Swift declaration 'dynamic' in library evolution mode is not supported если вы используете dynamic без @objc [Около]

У меня была такая же ошибка при импорте сторонних библиотек. Я исправил это с помощью наборов инструментов в Xcode и взял выпуск от 19 сентября 2019 года здесь https://swift.org/download/. После этого мне пришлось повторно импортировать свои библиотеки, и это сработало.

Это заставило мою ошибку компилятора исчезнуть.

  1. carthage bootstrap --platform ios
  2. brew bundle
  3. pod repo update

Распространение (BUILD_LIBRARY_FOR_DISTRIBUTION) -> Обновление Yes & Pod — ошибка у меня исчезла.

Еще один способ исправить это — просто дважды проверить модуль, который вы используете, и посмотреть, есть ли для него обновление. Я использовал ViewControllerPresentationSpy для тестирования контроллеров предупреждений в своем проекте. Я выполнил реинтеграцию модуля, а затем установил модуль, чтобы обновить версию с 5.1 до 6.0, поскольку автор этого модуля с тех пор выпустил для него обновление. Я удалил папку предыдущего модуля в своем проекте. Затем для новой версии я смог перетащить проект чуть выше всех моих тестов после очистки сборки и перехода в навигатор проекта и добавления его в раздел «Копировать файлы» для VC Presentation Spy в проект.

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

Я испытал это в репо после перехода на Xcode 11.3.1 из Xcode 12.3. Я вкратце обновил свои инструменты командной строки, и мне нужно было вернуть их к более ранней версии, чтобы получить возможность построения зависимостей.

Иногда может помочь запустить приложение на Apple M1

попробуйте также в терминале:

      arch -x86_64 pod install

Если даже после выполнения всех шагов, упомянутых выше, проблема не решена, попробуйте посмотреть, какие все папки предварительной сборки присутствуют в вашем репозитории, которые не имеют прямого отношения к вашему проекту. Удалите их все, удалите папку pods и podfile.lock и очистите производные данные, а затем попробуйте выполнить сборку.

Это сработало для меня:D

У меня была аналогичная проблема, когда я перешел с xcode 13.4 на xcode 14.1. Решение заключалось в том, чтобы установить соответствующий компилятор в Xcode - Настройки - Инструменты командной строки

Вы можете использовать Carthage для добавления фреймворка RxSwift.

По сути, Carthage предоставляет вам аналогичный традиционный пакет стиля RxSwift.framework.

Тогда попробуй carthage update --no-use-binaries.

Я столкнулся с той же проблемой, когда менял только ветки. Несколько раз удалял производные данные + чистую сборку. Это не сработало, пока я не перезапустил Xcode

Исправлена ​​ошибка, выполнив команду из корневой папки проекта:

      carthage update --use-xcframeworks --platform iOS --cache-builds
Другие вопросы по тегам