#ios #swift #xcode #unity3d #linker
#iOS #swift #xcode #unity3d #компоновщик
Вопрос:
У меня есть проект 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 заголовка bridging в мой проект: сбой
- Добавление пользовательских настроек
LD_VERIFY_BITCODE = NO
в XCode: сбой
Я использую:
- Xcode 12.2
- Firebase 6.34
- Swift 5.0
- Unity 2019.3.6f1
Любая помощь была бы признательна, я застрял на этом на некоторое время!
Ответ №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");