Xcode 11 не распознает архитектуру статической библиотеки: MacCatalyst (также известный как UIKitForMac)

После того, как я был взволнован объявлениями WWDC в 2019 году, я попытался скомпилировать свое существующее приложение iOS против MacOS с помощью бета-версии Xcode 11.0. К сожалению, все пошло не так, как ожидалось.

Xcode говорит, что моя статическая библиотека построена для «неизвестной» архитектуры:

Сборка для UIKit для Mac, но связанная библиотека libssl.a была создана для «неизвестного». Возможно, вам потребуется ограничить платформы, для которых эта библиотека должна быть связана в целевом редакторе.

Снимок экрана Xcode

Но когда я проверяю свои статические библиотеки, я вижу, что они действительно содержат желаемую архитектуру x86_64: введите описание изображения здесь

Я считаю, что эта проблема может быть связана с ошибкой Xcode Beta. Есть у кого-нибудь мысли по этому поводу?


person marcelosalloum    schedule 06.06.2019    source источник
comment
«Xcode говорит, что моя статическая библиотека создана для« неизвестной »архитектуры» Нет, это не так. Это говорит платформа. И это говорит о том, что у вас их слишком много, а не слишком мало.   -  person matt    schedule 07.06.2019
comment
Здесь есть возможное решение: forum.developer.apple.com/thread/117346 . Эдфорд, инженер-программист Apple, говорит: Библиотеки, созданные для симулятора iOS с предыдущими версиями Xcode, необходимо перестроить с Xcode 11 для среды Project Catalyst специально для Mac - есть различия в скомпилированном продукте и сборки для симулятора iOS недостаточно.   -  person marcelosalloum    schedule 27.06.2019


Ответы (2)


Однострочное исправление:

git clone [email protected]:marcelosalloum/OpenSSL-for-iPhone.git --branch feature/mac-catalyst && \
cd OpenSSL-for-iPhone && \
./build-libssl.sh --archs="MacOSX_x86_64 i386 arm64 armv7s armv7"

Объяснение:

По словам Эдфорда, инженера-программиста Apple, нам нужно создать наши двоичные файлы для платформы iOS с ориентацией на MacOSX и использовать CFLAG -target x86_64-apple-ios13.0-macabi. Здесь есть очень полезное обсуждение: https://forums.developer.apple.com/message/362577.

Я разветвил OpenSSL-for-iPhone здесь и реализовал поддержку MacCatalyst в ветке feature/mac-catalyst.

Вы можете построить его для MacCatalyst, указав archs или targets:

Вариант --archs, для OpenSSL ‹= 1.0.2:

git clone [email protected]:marcelosalloum/OpenSSL-for-iPhone.git --branch feature/mac-catalyst && \
cd OpenSSL-for-iPhone && \
./build-libssl.sh --archs="MacOSX_x86_64 i386 arm64 armv7s armv7"  --version="1.0.2l"

Вариант --targets для OpenSSL> = 1.1.0

git clone [email protected]:marcelosalloum/OpenSSL-for-iPhone.git --branch feature/mac-catalyst && \
cd OpenSSL-for-iPhone && \
./build-libssl.sh --targets="ios-sim-cross-i386 ios64-cross-arm64 ios-cross-armv7s ios-cross-armv7 mac-catalyst-x86_64" --version="1.1.0"
person marcelosalloum    schedule 02.07.2019
comment
Сможете ли вы поделиться своей библиотекой OpenSSL, созданной для UIKitForMac? Возникли проблемы со сборкой на моей машине. - person bmueller; 27.07.2019
comment
Привет, @bmueller, я обновил ответ выше. Вы сможете восстановить OpenSSL с MacCatalyst поддержкой, позвонив: bash git clone [email protected]:marcelosalloum/OpenSSL-for-iPhone.git --branch feature/mac-catalyst && cd OpenSSL-for-iPhone && ./build-libssl.sh --archs="MacOSX_x86_64 i386 arm64 armv7s armv7" - person marcelosalloum; 10.10.2019
comment
Спасибо! Скрипт хорошо работает с версией 1.0.2l. По какой-то причине он не работал с другими версиями Open SSL. - person stacky; 12.10.2019
comment
@marcelosalloum Сначала я попробовал версию 1.0.1e, но она терпела неудачу. Это дало мне хороший повод перейти на новую версию. Спасибо еще раз. Вы сэкономили мне много времени. - person stacky; 14.10.2019
comment
@marcelosalloum Не удается найти файлы в iPhoneSimulator13.2-x86_64.sdk, которые теперь находятся в MacOSX10.15-x86_64.sdk. Код не проверял, но предполагаю, что это происходит, когда lipoa fat lib. cp -r "MacOSX10.15-x86_64.sdk" "iPhoneSimulator13.2-x86_64.sdk" устраняет проблему. - person shallowThought; 13.11.2019
comment
@shallowThought: Как воспроизвести эту ошибку? У меня это работает, когда я запускаю параметр команды ./build-libssl.sh --archs="MacOSX_x86_64 i386 arm64 armv7s armv7" --version="1.0.2l" выше. Если вы поделитесь той командой, которую использовали, я могу взглянуть. Помните, что липофайл может содержать только один двоичный файл для каждой архитектуры, поэтому, если вы добавляете и MacOSX_x86_64 , и x86_64, это не сработает. - person marcelosalloum; 13.11.2019
comment
@marcelosalloum: это команда, которую мы запускаем из сценария сборки Xcode: ./build-libssl.sh --targets="ios-sim-cross-i386 ios64-cross-arm64 ios-cross-armv7s ios-cross-armv7 mac-catalyst-x86_64" --version="1.1.0". Я не связываюсь с липо, я просто догадался, что это то, что происходит в вашем коде. Попытка создать толстую библиотеку, содержащую фрагмент из несуществующего iPhoneSimulator13.2-x86_64.sdk. Это было только предположение, не обращайте внимания на эту часть. - person shallowThought; 14.11.2019

Все вышеперечисленные решения не помогли мне, поэтому я продолжил и попытался исправить это для своей системы под управлением Mac OSX 10.15.4.

В моем случае именно здесь вышеперечисленные решения перестали работать для меня:

no such sysroot directory: '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.4.sdk' [-Wmissing-sysroot]

Я прочитал файл build-libssl.sh заметил, что версия sdk была взята сценарием с использованием кода:

xcrun -sdk macosx --show-sdk-version

который в моей системе действительно возвращается:

10.15.4

Использование Finder для навигации к местоположению:

'/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/

показал мне, что MacOSX10.15.4.sdk действительно не существует. Однако был MacOSX10.14.sdk. Я использовал эти знания, чтобы придумать следующее решение:

Версия OpenSSL ‹= 1.0 (1.0.2l)

версии ‹= 1.0 должны использовать только --arch, а не --target!

git clone [email protected]:marcelosalloum/OpenSSL-for-iPhone.git --branch feature/mac-catalyst && \
cd OpenSSL-for-iPhone && \
./build-libssl.sh --arch="MacOSX_x86_64 i386 arm64 armv7s armv7 tv_x86_64 tv_arm64" --macosx-sdk=10.15 --version="1.0.2l"

Версия OpenSSL> = 1.1 (1.1.0) в настоящее время не работает

версии> = 1.1 следует использовать только --target, а не --arch!

git clone [email protected]:marcelosalloum/OpenSSL-for-iPhone.git --branch feature/mac-catalyst && \
cd OpenSSL-for-iPhone && \
./build-libssl.sh --targets="mac-catalyst-x86_64 ios-sim-cross-i386 ios64-cross-arm64 ios-cross-armv7s ios-cross-armv7 tvos-sim-cross-x86_64 tvos64-cross-arm64" --macosx-sdk=10.15 --version="1.1.0" -v
person Tom Vos    schedule 16.04.2020