Xcode 12, budujący dla iOS Simulator, ale łączący w pliku obiektowym zbudowanym dla iOS, dla architektury arm64

309

Próbuję uzyskać duży (i pracujący na Xcode 11!) Projekt budowania w Xcode 12 (beta 5) w celu przygotowania do iOS 14. Codebase był wcześniej Obj-C, ale teraz zawiera zarówno Obj-C, jak i Swift i używa podów, które są Obj-C i / lub Swift również.

Wyciągnąłem nową wersję beta cocoapodów z obsługą Xcode 12 (obecnie 1.10.0.beta 2).

Instalacja poda powiodła się. Kiedy robię kompilację, pojawia się następujący błąd w strukturze pod:

„Tworzenie dla symulatora iOS, ale łączenie w pliku obiektowym zbudowanym dla iOS, dla architektury arm64”

Kiedy idę uruchomić lipo -info na frameworku, ma: armv7s armv7 i386 x86_64 arm64.

Wcześniej projekt miał ustawione Valid Architectures na: armv7, armv7s i arm64.

W Xcode 12 to ustawienie zniknie, zgodnie z dokumentacją Apple. Architektura jest ustawiona na $ (ARCHS_STANDARD). Nie mam nic ustawionego w wykluczonych architekturach.

Czy ktoś ma pojęcie, co może się tutaj dziać? Nie mogłem jeszcze tego odtworzyć za pomocą prostszego projektu.

btxios
źródło
3
To działa dla mnie: stackoverflow.com/questions/24924809/ ...
Narendar Singh Saini
Przeczytaj artykuł: milanpanchal24.medium.com/…
MilanPanchal
Mam Apple Silicon M1 i nadal napotykam ten błąd arm64. Dlaczego tak się stało?
Aspen

Odpowiedzi:

481

Zasadniczo musisz wykluczyć arm64architekturę symulatora zarówno z projektu, jak i projektu Poda,

  • Aby to zrobić, przejdź do ustawień kompilacji projektu i dodaj Any iOS Simulator SDKwartość w arm64środku Excluded Architecture.

    wprowadź opis obrazu tutaj

LUB

  • Jeśli używasz XCConfigplików niestandardowych , możesz po prostu dodać tę linię, aby wykluczyć architekturę symulatora.
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64

Następnie

Musisz zrobić to samo dla projektu Pod, dopóki wszyscy dostawcy kapsułek kakaowych nie zakończą dodawania kolejnych w swoim Podspec .

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }

Możesz ręcznie dodać Excluded Architechurew ustawieniach kompilacji projektu Poda , ale zostanie on nadpisany, gdy użyjesz pod install.

Zamiast tego możesz dodać ten fragment do swojego Podfile. Za każdym razem, gdy uruchomisz, zapisze niezbędne ustawienia kompilacjipod install

post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
  end
end
Amit Samant
źródło
4
Dodatkowy szczegół dotyczący CocoaPods jest miły. Należy pamiętać, że bez [sdk=iphonesimulator*]po EXCLUDED_ARCHS, XCode nie uda się znaleźć strąków budując dla rzeczywistego urządzenia, ponieważ żadna ze strąków zostanie zbudowany na arm64.
mwu
6
Pracował dla mnie! Zwróć uwagę, że post_install do |installer|w większości plików Podfiles istnieje już sekcja z powodu flippera. Wklej wewnętrzną sekcję installer.pods_project.build_configurations.each do |config| config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" endza flipper_post_install(installer)linią.
Ramon Vermeulen
5
Dostaję building for iOS Simulator, but linking in object file built for macOS, for architecture x86_64. Jak to naprawić?
Sazzad Hissain Khan
3
To rozwiązanie jest doskonałe i dodam, że jeśli budujesz swój własny strąk, zwróć uwagę szczególnie na 2 wiersze, które autor sugeruje po "... dopóki wszyscy sprzedawcy strączków kakaowych nie skończą dodawać w swoim Podspec", ponieważ ich brak w moim własnym środowisku Podspec powodował awarie lintingu, gdy próbowałem przenieść go do mojego prywatnego repozytorium. Dzięki!
Danny
1
Rozwiązanie ma wadę, która powoduje problemy, ponieważ autorzy pod specyfikacji znaleźli i zastosowali to rozwiązanie. Problematyczną częścią jest użycie user_target_xcconfig. Ponieważ wiele specyfikacji EXCLUDED_ARCHSpodów definiuje różne wartości, ponieważ są w konflikcie, a CocoaPods emituje takie ostrzeżenia [!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values.. Odnośnik składni podspec mówi, że ten atrybut jest „niezalecany” guide.cocoapods.org/syntax/podspec.html#user_target_xcconfig
leberwurstsaft
117

TL; DR;

Ustaw opcję „Build Active Architecture Only ( ONLY_ACTIVE_ARCH)” na Yes dla swoich bibliotek / aplikacji, nawet w trybie wydania .


Próbując zidentyfikować główną przyczynę problemu, zdałem sobie sprawę z kilku zabawnych faktów na temat Xcode 12.

  1. Xcode 12 jest tak naprawdę odskocznią dla Apple Silicon, który niestety nie jest jeszcze dostępny. Ale dzięki tej platformie otrzymamy macOS oparty na arm64, w którym symulatory będą również działać na architekturze arm64, w przeciwieństwie do obecnej architektury x86_64 opartej na Intelu.

  2. Xcode zwykle opiera się na „Run Destination”, aby zbudować swoje biblioteki / aplikacje. Tak więc, gdy symulator jest wybrany jako „miejsce docelowe uruchamiania”, tworzy aplikację dla dostępnych architektur symulatora, a gdy urządzenie jest wybrane jako „miejsce docelowe uruchamiania”, buduje je dla architektury obsługiwanej przez urządzenie ( arm*).

  3. xcodebuild, w systemie kompilacji Xcode 12+ uważa się arm64za prawidłową architekturę symulatora. Więc kiedy symulator zostanie wybrany jako miejsce docelowe uruchomienia, może potencjalnie spróbować skompilować / połączyć twoje biblioteki / aplikacje również z arm64bazującymi na nich symulatorami (jeszcze niedostępne). Więc wysyła clang(++)jakąś flagę -target, jak arm64-apple-ios13.0-simulatorw formacie <architecture> - <os> - <sdk> - <platform> i clang próbuje zbudować / połączyć się z symulatorem opartym na arm64, który ostatecznie zawodzi na Macu opartym na Intelu.

  4. Ale xcodebuildpróbuje tego tylko w przypadku kompilacji wydania . Czemu? Ponieważ ustawienia kompilacji „Build Active Architecture Only ( ONLY_ACTIVE_ARCH)” są zwykle ustawione na „No” (Nie) tylko dla konfiguracji „Release”. A to oznacza, xcodebuildże spróbujemy zbudować wszystkie warianty architektoniczne twoich bibliotek / aplikacji dla wybranego miejsca docelowego uruchamiania dla kompilacji wydania. A jeśli chodzi o miejsce docelowe uruchomienia symulatora, będzie zawierało oba x86_64i arm64teraz włączone, ponieważ arm64w Xcode 12+ jest również obsługiwana architektura dla symulatorów obsługujących Apple Silicon.

Mówiąc najprościej, Xcode nie zbuduje Twojej aplikacji za każdym razem, gdy spróbuje użyć wiersza polecenia xcodebuild(co domyślnie powoduje wydanie kompilacji, zobacz kartę ogólną ustawień projektu) lub w inny sposób i spróbuje zbudować wszystkie warianty architektoniczne obsługiwane przez miejsce docelowe uruchamiania . Dlatego prostym obejściem tego problemu jest ustawienie „Build Active Architecture Only ( ONLY_ACTIVE_ARCH)” na Yes w swoich bibliotekach / aplikacjach, nawet w trybie wydania.

wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj

Jeśli biblioteki są uwzględnione jako pody i masz do nich dostęp .podspec, możesz po prostu ustawić:

spec.pod_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'TAK'}

spec.user_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'YES'} # niezalecane

Osobiście nie podoba mi się druga linia, ponieważ pody nie powinny zanieczyszczać projektu docelowego i mogą zostać zastąpione w samych ustawieniach docelowych. Tak więc projekt konsumencki powinien w jakiś sposób odpowiadać za nadpisanie ustawienia. Jednak może to być konieczne do pomyślnego kłaczkowania podspecs.

Jeśli jednak nie masz dostępu do .podspec, zawsze możesz zaktualizować ustawienia podczas instalacji podów:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"
    end
  end
end

Martwiłem się o to, jaki będzie to wpływ, kiedy faktycznie zarchiwizujemy biblioteki / aplikacje. Podczas archiwizacji aplikacje zwykle przyjmują konfigurację „Release”, a ponieważ będzie to tworzenie kompilacji wydania uwzględniającej tylko aktywną architekturę bieżącego miejsca docelowego uruchomienia, przy takim podejściu możemy utracić wycinki dla armv7, armv7s itp. Z docelowej kompilacji. Jednak zauważyłem, że dokumentacja mówi (zaznaczona na załączonym obrazku), że to ustawienie zostanie zignorowane, gdy wybierzemy „Generic iOS Device / Any Device” jako miejsce docelowe uruchomienia, ponieważ nie definiuje ono żadnej konkretnej architektury. Więc myślę, że powinniśmy być dobrzy, jeśli zarchiwizujemy naszą aplikację, wybierając ją jako miejsce docelowe.

Ayan Sengupta
źródło
1
To naprawdę zaskakująca odmiana od Apple i kosztowało mnie pół dnia, aby dowiedzieć się, co moim zdaniem Apple powinno to zrekompensować :). To nie jest udokumentowana aktualizacja (przynajmniej z tego, co wiem) i na pewno wpłynie na każdą aktualizację do Xcode 12. Mam tylko nadzieję, że każdy znajdzie swój własny sposób na to, by sobie z tym poradzić, gdy tylko pozna podstawy.
Ayan Sengupta
1
Jeśli używa się wielu specyfikacji user_target_xcconfigpodów, a wartości nie pasują dokładnie, CocoaPods będzie emitować takie ostrzeżenia [!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values.. Odnośnik składni podspec mówi, że ten atrybut jest „niezalecany” guide.cocoapods.org/syntax/podspec.html#user_target_xcconfig . Więc nie używaj user_target_xcconfigtego, aby zaoszczędzić wielu programistom kłopotów.
leberwurstsaft
2
Dobrze! Myślę, że wspomniałem już o tym w mojej odpowiedzi.
Ayan Sengupta
1
Myślę, że jest to najlepsze rozwiązanie, ponieważ nie psuje kompilacji z Xcode 11. Zastosowałem to ustawienie dla całego projektu, a potem nie musiałem ustawiać go osobno dla Podów lub celów. I działa wtedy zarówno na Xcode 11.7, jak i Xcode 12. Wyłączenie arch arm64jest mapowane w Xcode 11.7, x86_64dlatego wyklucza główną architekturę symulatora.
Wojciech Kulik
2
Udało mi się to wszystko działało w końcu z 'EXCLUDED_ARCHS [sdk = iphonesimulator *]' => 'arm64', ale tylko w pod_target_xcconfig i tylko na module problemu (który zawierał wstępnie zbudowaną bibliotekę) i pojedynczym pod, który zależał od pod problem. Wszystko inne było czyste. Zdecydowałem, że wolę to od rozwiązania z aktywnym łukiem.
Airsource Ltd
72

Znalazłem rozwiązanie! https://developer.apple.com/forums/thread/657913

Jeśli ustawisz wykluczone architektury dla symulatora na arm64, zostanie on skompilowany.

z wyłączeniem architektur dla symulatora

SlashDevSlashGnoll
źródło
W porządku, problem, który miałem, dotyczył ręcznie połączonej biblioteki, ale nie spowodował problemu z naszymi podami, których używamy.
SlashDevSlashGnoll
5
Ja testowałem na prawach trybie, więc musiałem go dodać do wydania zbyt
MujtabaFR
Myślę, że po tym poście wróciliśmy do biznesu. dziękuję, pomogło.
JBarros35
@btxios Podczas tworzenia archiwum napotykam problem „ARCHS [@]: zmienna niezwiązana”. Czy udało Ci się rozwiązać ten problem?
ArdenDev
50

Ustawienie kompilacji Prawidłowe architektury zostało usunięte w Xcode 12. Jeśli masz wartości w tym ustawieniu kompilacji, powodują one problem i należy je usunąć.

Udało mi się „wyczyścić” ustawienie kompilacji VALID_ARCHS, dodając je z powrotem jako ustawienie kompilacji zdefiniowane przez użytkownika (bez wartości), uruchamiając projekt (co się nie udało), a następnie usuwając ustawienie kompilacji VALID_ARCHS. Po tym mogłem uruchomić na symulatorze.

Ustawienie kompilacji Moje architektury to Standardowe architektury.

Możesz dodać ustawienie zdefiniowane przez użytkownika za pomocą przycisku plusa w ustawieniach kompilacji:

Ustawienie zdefiniowane przez użytkownika

kod trishcode
źródło
9
To powinna być akceptowana odpowiedź. Upewnij się, że projekt aplikacji jest wybrany, a nie element docelowy. W przeciwnym razie nie będziesz w stanie usunąć VALID_ARCHS z ustawień kompilacji. :)
Bionicle,
2
@trishcode Nawet po wykonaniu tej czynności otrzymuję ten sam błąd (xcode12 beta4), wszelkie obejścia
Sivakrishna Perla
3
@SivakrishnaPerla Jeśli możesz otworzyć projekt w Xcode 11, możesz zobaczyć dokładnie, na których obiektach docelowych są używane prawidłowe architektury. Możesz nawet wyczyścić ustawienie w Xcode 11, a następnie ponownie wypróbować projekt w Xcode 12. Jeśli nadal potrzebujesz obejścia i otrzymujesz błąd w osadzonym frameworku, odpowiedź SlashDevSlashGnoll powinna działać. Jeśli potrzebujesz obejścia i otrzymujesz błąd na Cocoapod, wyklucz architekturę arm64 w poinstalacyjnej instalacji Podfile.
trishcode
1
@trishcode Dzięki, ustawienie arm64 w wykluczonej architekturze i usunięcie VALID_ARCHS zadziałało.
Sivakrishna Perla
1
Jeśli usunę VALID_ARCHS i dodam arm64 do architektury wykluczonej, otrzymuję ten błąd - sprawdź zależności Brak architektur do kompilacji (ARCHS = arm64 x86_64, VALID_ARCHS =, EXCLUDED_ARCHS = (arm64)).
nOOb iOS
14

Xcode 12.3

Rozwiązałem ten problem, ustawiając Validate Workspace na Yes

wprowadź opis obrazu tutaj

RunesReader
źródło
Rozwiązałem mój problem, dzięki!
Declan Land
1
Nie rozwiązało mojego problemu
Aspen
Rozwiązałem mój problem. Najłatwiejsza naprawa! Cieszę się, że udało się to rozwiązać, ale czy ktoś może wyjaśnić, jak to rozwiązuje problem?
njdeveloper
11

Jeśli masz problemy w Xcode 12 z symulatorami, a nie prawdziwym urządzeniem, tak, musisz usunąć ustawienia VALID_ARCHS , ponieważ nie są już obsługiwane. Przejdź do „ustawień kompilacji”, wyszukaj „ VALID_ARCHS ” i usuń właściwości zdefiniowane przez użytkownika. Zrób to w każdym celu, jaki masz.

Mimo to może być konieczne dodanie skryptu na dole pliku podfile, aby skompilować pody z odpowiednią architekturą i celem wdrożenia:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
      config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
     end
  end
end
Medhi
źródło
Usunięcie VALID_ARCHSz mojego projektu działało dobrze. Nic nie zmieniłem ani w pliku podfile, ani w projekcie podów.
Ángel Téllez
9

Po aktualizacji do Xcode 12 nadal byłem w stanie zbudować dla prawdziwego urządzenia, ale nie symulatora. Kompilacja Podfile działała tylko na prawdziwym urządzeniu.

Usunąłem VALID_ARCHS w Ustawieniach kompilacji> Zdefiniowane przez użytkownika i zadziałało! Uderzyłem się w głowę przez jakiś czas, zanim to znalazłem.

Nawigator
źródło
8

U mnie zadziałało następujące ustawienie:

Ustawienia budowania >> Wykluczone architektury

dodano „arm64” do trybu wydania i debugowania dla opcji „Any iOS Simulator SDK”.

wprowadź opis obrazu tutaj

Raghav
źródło
6

Myślę, że znalazłem odpowiedź. Zgodnie z informacjami o wersji Xcode 12 beta 6:

Edytor ustawień kompilacji nie zawiera już ustawienia kompilacji Prawidłowe architektury (VALID_ARCHS) i odradza się jego używanie. Zamiast tego dostępne jest nowe ustawienie kompilacji wykluczonych architektur (EXCLUDED_ARCHS). Jeśli projekt zawiera VALID_ARCHS, ustawienie jest wyświetlane w oknie User - Zdefiniowana sekcja edytora ustawień kompilacji. (15145028) "

Udało mi się rozwiązać ten problem, ręcznie edytując plik projektu (nie mogłem dowiedzieć się, jak usunąć element z pliku projektu za pomocą Xcode) i usuwając wszystkie wiersze odnoszące się do VALID_ARCHS. Po tym jestem w stanie dobrze zbudować symulator.

btxios
źródło
1
Korzystanie z Xcode, VALID_ARCHS jest w wybierz Project (nie docelowy), a następnie `Setting Build -> User-Defined” wybierz go i usuń go..
Akshay
To rozwiązanie zadziałało dla mnie. Rozwiązanie sugerowane przez innych nie działało, ponieważ po prostu dodanie wartości „arm64” do pola „Wyklucz architekturę” zaczęło powodować wystąpienie błędu „Uprawnienia do pliku” dla wygenerowanego pliku .app.
archeopetrix
6

Rozwiązuję problem, dodając „arm64” w „Wykluczonych architekturach” zarówno dla celu projektu, jak i celu pod.

Xcode -> Projekt docelowy -> Ustawienia kompilacji -> Wykluczone architektury> „arm64”

Xcode -> Pod Target -> Ustawienia kompilacji -> Wykluczone architektury> "arm64"

Vader
źródło
6

Xcode 12

Usuwanie VALID_ARCHz ustawień kompilacji w ramach pracy grupowej zdefiniowanej przez użytkownika za mnie.

wprowadź opis obrazu tutaj

Pratik Sodha
źródło
5

W twoim pliku xxx.framework podspec dodaj follow config unikaj pakietu pod zawiera archiwa symilatora arm64

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
jiawei wang
źródło
Zadziałało! Jednak oznacza to, że Pod nie można używać na komputerach Mac z Apple Silicon?
tomacco
Czy jest to potwierdzone @tomacco?
Fernando Reynoso
2
@FernandoReynoso Właśnie otrzymałem zestaw przejściowy dla programistów, (ARM MacMini) przetestuje i zgłosi później dzisiaj
tomacco
@tomacco Czy byłeś w stanie to przetestować?
Houman,
Jeśli używa się wielu specyfikacji user_target_xcconfigpodów, a wartości nie pasują dokładnie, CocoaPods będzie emitować takie ostrzeżenia [!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values.. Odnośnik składni podspec mówi, że ten atrybut jest „niezalecany” guide.cocoapods.org/syntax/podspec.html#user_target_xcconfig . Więc nie używaj user_target_xcconfigtego, aby zaoszczędzić wielu programistom kłopotów.
leberwurstsaft
4

Miałem problemy z budowaniem frameworków z wiersza poleceń. Mój framework zależy od innych frameworków, w których brakowało wsparcia dla symulatorów opartych na ARM. Skończyło się na wykluczeniu wsparcia dla symulatorów opartych na ARM, dopóki nie zaktualizuję moich zależności.

Potrzebowałem EXCLUDED_ARCHS=arm64flagi podczas budowania frameworka dla symulatorów z CLI.

xcodebuild archive -project [project] -scheme [scheme] -destination "generic/platform=iOS Simulator" -archivePath "archives/[scheme]-iOS-Simulator" SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES EXCLUDED_ARCHS=arm64
inder_gt
źródło
1
To samo tutaj. Kluczowy „problem” w tym scenariuszu polega w rzeczywistości na tworzeniu ogólnego miejsca docelowego za pośrednictwem -destination "generic/platform=iOS Simulator". Prowadzi to do budowania dla wszystkich dostępnych architektur, w tym arm64 od Xcode 12.
Sascha
4

Po wypróbowaniu prawie każdego postu w tym wątku i przeczytaniu forów programistów Apple stwierdziłem, że tylko jedno rozwiązanie działa dla mnie.

Tworzę uniwersalną strukturę, która jest używana w szybkiej aplikacji. Nie mogłem zbudować symulatora bez błędów architektury.

W moim projekcie Framework mam zadanie Universal Framework w moich fazach kompilacji, jeśli tak jest w Twoim przypadku

  • Dodaj następujące elementy do swojego xcodebuildzadania w fazie kompilacji: EXCLUDED_ARCHS="arm64"

Następnie musisz zmienić następujący projekt Build Settings:

  • Usuń VALID_ARCHSustawienie zdefiniowane przez użytkownika
  • Ustaw ONLY_ACTIVE_ARCHna YES***

*** Jeśli tworzysz framework i masz również aplikację demonstracyjną, to ustawienie musi być włączone w obu projektach.

willhess
źródło
4

Aktualizacje: październik 2020 r

Możesz po prostu ustawić arm64tylko dla Debug > Simulator - iOS 14.O SDKarchitektury wykluczonej.

wprowadź opis obrazu tutaj

Sunil Targe
źródło
3

Dla programistów podów W swoim Podspecu dodaj:

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }

Następnie w swoim przykładowym projekcie Przykładowe ustawienia plików projektu

Zobacz, jak działa w tym projekcie

Pacu
źródło
Jeśli używa się wielu specyfikacji user_target_xcconfigpodów, a wartości nie pasują dokładnie, CocoaPods będzie emitować takie ostrzeżenia [!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values.. Odnośnik składni podspec mówi, że ten atrybut jest „niezalecany” guide.cocoapods.org/syntax/podspec.html#user_target_xcconfig . Więc nie używaj user_target_xcconfigtego, aby zaoszczędzić wielu programistom kłopotów.
leberwurstsaft
2

Miałem również ten sam problem z określoną biblioteką, która została zainstalowana za pośrednictwem kartaginy. Dla tych, którzy używają Kartaginy, ponieważ Kartagina nie działa po wyjęciu z pudełka z Xcode 12, ten dokument przedstawia obejście, które działa w większości przypadków. W skrócie, Carthage buduje grube frameworki, co oznacza, że ​​framework zawiera pliki binarne dla wszystkich obsługiwanych architektur. Do czasu wprowadzenia Apple Sillicon wszystko działało dobrze, ale teraz jest konflikt, ponieważ istnieją zduplikowane architektury (arm64 dla urządzeń i arm64 dla symulatora). Oznacza to, że Kartagina nie może łączyć ram specyficznych dla architektury z pojedynczą grubą strukturą.

Możesz postępować zgodnie z instrukcjami tutaj. Kartagina XCODE 12

Następnie po skonfigurowaniu Kartaginy. Umieść arm64 w „Excluded Architectures” w ustawieniach kompilacji. wprowadź opis obrazu tutaj

Spróbuj uruchomić swój projekt za pomocą symulatora. Symulator powinien działać bez żadnych błędów.

vidalbenjoe
źródło
1

Problemem są tutaj prawidłowe architektury w Xcode 11, otwórz projekt w Xcode 11 i zmień wartość prawidłowych architektur na $ (ARCHS_STANDARD) zarówno dla projektu, celu, jak i podów, ponownie otwórz projekt w Xcode 12 i skompiluj

user4478383
źródło
1

Ustaw "Build Active Architecture Only"(ONLY_ACTIVE_ARCH)kompilację na tak, xcodeprosi o arm64 ze względu na architekturę Silicon MAC, która jest arm64.

arm64 został dodany jako łuk symulatora w Xcode12 w celu obsługi Silicon MAC.

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/SDKSettings.json

Aravind
źródło
Jeśli nie działa na krzemowym komputerze Mac, to na pewno powinien wiedzieć, że nie używa arm64?
Jonathan.
@Jonathan. Tak, należało to zrobić, ale obecnie tak nie jest.
Aravind
1

W moim przypadku: Xcode 12

Ustawiam puste wartości EXCLUDED_ARCHS i ustawiam ONLY_ACTIVE_ARCHDebug = YESRelease = NO Project's Build Setting

i umieściłem to w moim pliku Podfile:

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
        end
    end
end

Działa na moim symulatorze iPhone 8 (iOS 12) i iPhone 11 Pro Max (iOS 14) oraz na moim urządzeniu iPhone 7 Plus (iOS 13.4)

mitchy_dev
źródło
1

Podczas Build Settingswyszukiwania VALID_ARCHnaciśnij delete. To powinno działać dla mnie z Xcode 12.0.1

VALID_ARCH w ustawieniach kompilacji

Cuong Lam
źródło
2
Nie znalazłem VALID_ARCH, co to jest?
Houman
1

Dodawaj tylko Any iOS Simulator SDK -> x86_64doProject's Build Settings -> VALID_ARCHS prac dla mnie.

Wersja Xcode: 12.1 (12A7403)

wprowadź opis obrazu tutaj

Jeśli Twój projekt zawiera platformy, które nie obsługują x86_64.

  • Możesz dodać te nazwy struktur ( xxx.framework) doTarget -> Build Settings -> Excluded Source File Names -> Debug -> Any iOS Simulator SDK .
  • A następnie zmodyfikuj, Framework Search Pathsaby usunąć ścieżki tych struktur dla Debug -> Any iOS Simulator SDK.

Te dwa ustawienia mogą uniemożliwić Xcode tworzenie i łączenie tych struktur w trybie symulatora.

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

Daemonson Dong
źródło
1

Rozumiem problem z arm64 i Xcode 12 i udało mi się rozwiązać problemy z kompilacją, wykluczając architekturę arm64 dla iPhone Simulator lub ustawiając ONLY_ACTIVE_ARCH dla schematu wydania. Jednak nadal mam problemy z wypchnięciem mojego frameworka za pomocą wypychania pod repo.

Dowiedziałem się, że ustawienie s.pod_target_xcconfig w moim podspec nie powoduje zastosowania tego ustawienia do zależności zdefiniowanych w tym samym podspec. Widzę to w fałszywym projekcie aplikacji, który Cocoapods generuje podczas walidacji. Sprawdzanie poprawności Cocoapods uruchamia schemat wydania dla symulatora i kończy się niepowodzeniem, gdy jedna lub więcej zależności nie wyklucza arm64 lub nie jest skonfigurowana do budowania tylko aktywnej architektury.

Rozwiązaniem może być wymuszenie na Cocoapods dodania skryptu po instalacji podczas walidacji projektu lub pozwolenie na budowanie schematu debugowania, ponieważ schemat debugowania tworzy tylko aktywną architekturę.

Skończyło się na użyciu Xcode 11, aby zwolnić mój kapsułę, aby przejść weryfikację. Możesz pobrać Xcode 11 z developer.apple.com, skopiować go do folderu Aplikacje jako Xcode11.app i przełączyć używając sudo xcode-select --switch /Applications/Xcode11.app/Contents/Developer. Nie zapomnij przełączyć się z powrotem po zakończeniu.

Rudolf Kopřiva
źródło
1

Po wypróbowaniu i wyszukaniu różnych rozwiązań, myślę, że najbezpieczniejszym sposobem jest dodanie następującego kodu na końcu pliku Podfile

post_install do |pi|
   pi.pods_project.targets.each do |t|
       t.build_configurations.each do |bc|
          bc.build_settings['ARCHS[sdk=iphonesimulator*]'] =  `uname -m`
       end
   end
end

W ten sposób nadpisujesz architekturę kompilatora symulatora iOS tylko jako architekturę bieżącego procesora. W porównaniu do innych rozwiązanie to sprawdzi się również na komputerach z Apple Silicon .

OmerTurhn
źródło
Wspaniale jest widzieć, że ktoś przynajmniej rozumie problem i nie sugeruje po prostu usunięcia obsługi Apple Silicon dla symulatora iOS.
Camsoft
0

W moim przypadku:

Miałem 4 konfiguracje (+ DebugQa i ReleaseQa) Cocoapods jest używany jako menedżer zależności

Do debugowania zebrałem na urządzeniu i w symulatorze, a na qa tylko na urządzeniu.

Pomogło to ustawić BuildActiveArchitecture na tak w PodsProject

voragomod
źródło
0

W moim przypadku próbowałem uruchomić na symulatorze watchOS 7 w trybie Relese, ale symulator iOS 14 był w trybie debugowania.

Dlatego po prostu umieszczenie obu Simów w trybie debugowania / wydania rozwiązało problem!

Cosmin
źródło
0

Przełącz konfigurację kompilacji z powrotem do trybu debugowania lub włącz opcję Kompiluj tylko aktywną architekturę zarówno dla trybu debugowania, jak i trybu wydania. Powodem jest to, że twoja biblioteka / framework nie obsługuje nowej architektury symulatora ARM64 (działa na Macu z procesorem Apple Silicon)

Tran Anh Khoa
źródło
0

Dodaj wiersz „arm64” (bez cudzysłowów) do ścieżki: Xcode -> Projekt -> Ustawienia kompilacji -> Architektury -> Architektury wykluczone Zrób to samo dla Podów. W obu przypadkach dla pól debugowania i Release.

lub szczegółowo ...

Błędy wspomniane tutaj podczas wdrażania do symulatora przy użyciu Xcode 12 są również jedną z rzeczy, które miały na mnie wpływ. Wystarczy kliknąć prawym przyciskiem myszy każdy z moich projektów i wyświetlić go w wyszukiwarce, otworzyć plik .xcodeproj w Atom, a następnie przejść przez plik .pbxproj i usunąć wszystkie ustawienia VALIDARCHS. To właśnie sprawiło, że to zadziałało dla mnie. Wypróbowałem kilka innych sugestii (z wyjątkiem arm64, Build Active Architecture Only), które wydawały się prowadzić do dalszej kompilacji, ale ostatecznie pozostawiły mnie z innym błędem. Posiadanie ustawień VALIDARCH leżących w pobliżu jest prawdopodobnie najlepszą rzeczą do sprawdzenia w pierwszej kolejności.

Sohaib Aslam
źródło
0

Dzielenie się rozwiązaniem, które u mnie zadziałało, które może komuś pomóc

Problem podczas kompilacji dla symulatora:

budowanie dla iOS Simulator, ale łączenie w pliku obiektowym zbudowanym dla iOS, dla architektury arm64

XCODE 12.1, POD 1.9.1

Struktura mojego projektu

  • Główny cel
  • Udostępnij rozszerzenie
  • Rozszerzenie usługi powiadomień
  • Moduł podrzędny, ramy niestandardowe
  • Podfile
  1. Dodaj arm64do ustawień kompilacji -> Exclude Architecturewe wszystkich celach.

wprowadź opis obrazu tutaj

  1. Usunięty arm64z VALID_ARCHSi dodano x86_64we wszystkich celów.

wprowadź opis obrazu tutaj

  1. Dodaj następujący kod w podfile

    post_install do |installer|
        installer.pods_project.build_configurations.each do |config|
        config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
     end
    end
    
  2. Zrobił pod update, usunął podfile.locki zrobiłpod install

  3. Czysta kompilacja.

Gokul G
źródło
0

Po wypróbowaniu wielu bezużytecznych odpowiedzi online. To działa dla mnie.

Najpierw generuje x86_64 dla projektów Pod !!!!

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['ARCHS'] = "arm64 x86_64"
        end
    end
end

Po drugie, dodaj „x86_64” dla VALID_ARCHS

wprowadź opis obrazu tutaj

YanXing Ou
źródło