Почему после обновления до Xcode 12 появляется ошибка связывания?

У меня есть проект Unity, в котором используется собственная библиотека Swift + ObjC, которую я сделал с помощью Firebase MLKit. При попытке собрать для iOS проект Unity всегда строится с Xcode 11.3.1, но при обновлении до любой версии Xcode 12.X я получаю следующие ошибки:

ld: warning: Could not find or use auto-linked library 'swiftCoreMIDI'
ld: warning: Could not find or use auto-linked library 'swiftUniformTypeIdentifiers'
Undefined symbols for architecture armv7:
  "__swift_FORCE_LOAD_$_swiftUniformTypeIdentifiers", referenced from:
      __swift_FORCE_LOAD_$_swiftUniformTypeIdentifiers_$_NativeLibrary_iOS in NativeLibrary_iOS.a(NativeLibrary.o)
      __swift_FORCE_LOAD_$_swiftUniformTypeIdentifiers_$_NativeLibrary_iOS in NativeLibrary_iOS.a(UIImage.o)
     (maybe you meant: __swift_FORCE_LOAD_$_swiftUniformTypeIdentifiers_$_NativeLibrary_iOS)
  "__swift_FORCE_LOAD_$_swiftCoreMIDI", referenced from:
      __swift_FORCE_LOAD_$_swiftCoreMIDI_$_NativeLibrary_iOS in NativeLibrary_iOS.a(NativeLibrary.o)
      __swift_FORCE_LOAD_$_swiftCoreMIDI_$_NativeLibrary_iOS in NativeLibrary_iOS.a(UIImage.o)
     (maybe you meant: __swift_FORCE_LOAD_$_swiftCoreMIDI_$_NativeLibrary_iOS)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Я не использую ни swiftCoreMIDI, ни swiftUniformTypeIdentifiers в своем коде. Для справки, я перекомпилировал свою родную библиотеку с Xcode 12, прежде чем снова импортировать ее в Unity.

Вещи, которые я пробовал:

  • Создание проекта Unity с помощью библиотеки Swift, не использующей Firebase MLKit: отлично работает
  • Создание проекта только для Xcode, использующего Firebase MLKit: отлично работает
  • Сборка проекта с использованием более поздней версии Unity: сбой
  • Прямая интеграция фреймворков Firebase SDK вместо использования CocoaPods: не удается
  • Добавление пустого файла Swift + заголовок моста в мой проект: не удается
  • Добавление пользовательской настройки LD_VERIFY_BITCODE = NO в XCode: не удается

Я использую:

  • Xcode 12.2
  • Firebase 6.34
  • Swift 5.0
  • Единство 2019.3.6f1

Любая помощь будет принята с благодарностью, я застрял на этом какое-то время!


person PaulineTilak    schedule 04.12.2020    source источник


Ответы (1)


РЕШЕНИЕ

Я наконец нашел решение, оно было связано с целью UnityFramework в Xcode. Мне пришлось удалить некоторые архитектуры, которые не связаны с моей сборкой: i386 и x86_64. Кроме того, я обновил Пути поиска в библиотеке, чтобы включить $(SDKROOT)/usr/lib/swift.

Чтобы выполнить эти действия автоматически, вы можете добавить эти строки в PostProcessBuild файл в свой проект Unity:

var projPath = pathToBuiltProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
var proj = new PBXProject();
proj.ReadFromFile(projPath);

// Update the Library Search Paths of the whole Xcode project
proj.AddBuildProperty(proj.ProjectGuid(), "LIBRARY_SEARCH_PATHS", "$(SDKROOT)/usr/lib/swift");

// Get the UnityFramework target and exclude the unwanted architectures
var unityFrameworkGuid = proj.TargetGuidByName("UnityFramework");
proj.SetBuildProperty(unityFrameworkGuid, "EXCLUDED_ARCHS", "i386");
proj.AddBuildProperty(unityFrameworkGuid, "EXCLUDED_ARCHS", "x86_64");
person PaulineTilak    schedule 07.12.2020