Xcode 12, erstellt für iOS Simulator, aber Verknüpfung in einer für iOS erstellten Objektdatei für Architektur arm64

219

Der Versuch, ein großes (und an Xcode 11!) Projektgebäude in Xcode 12 (Beta 5) zur Vorbereitung auf iOS 14 zu erstellen. Codebase war zuvor Obj-C, enthält jetzt jedoch sowohl Obj-C als auch Swift und verwendet Pods Obj-C und / oder Swift ebenfalls.

Ich habe die neue Beta von Cocoapods mit Xcode 12-Unterstützung (derzeit 1.10.0.beta 2) gezogen.

Die Pod-Installation ist erfolgreich. Wenn ich einen Build mache, wird auf einem Pod-Framework der folgende Fehler angezeigt:

"Erstellen für iOS Simulator, aber Verknüpfen in einer für iOS erstellten Objektdatei für Architektur arm64"

Wenn ich lipo -info auf dem Framework ausführe, hat es: armv7s armv7 i386 x86_64 arm64.

Zuvor waren für das Projekt gültige Architekturen auf armv7, armv7s und arm64 festgelegt.

In Xcode 12 verschwindet diese Einstellung gemäß der Dokumentation von Apple. Architekturen sind auf $ (ARCHS_STANDARD) festgelegt. Ich habe nichts in ausgeschlossenen Architekturen festgelegt.

Hat jemand eine Idee, was hier los sein könnte? Ich konnte dies mit einem einfacheren Projekt noch nicht reproduzieren.

btxios
quelle
1
Ich erhalte dasselbe für einen Linkschritt eines Frameworks eines Drittanbieters, das manuell in das Projekt aufgenommen wird. Ich bin gespannt, ob Sie eine Lösung finden.
SlashDevSlashGnoll
Haben Sie das in der Zwischenzeit gelöst? (Mitte September, noch Xcode 12 Beta 6)
Epologee
2
Dies funktioniert für mich: stackoverflow.com/questions/24924809/…
Narendar Singh Saini
3
Ich building for iOS Simulator, but linking in object file built for macOS, for architecture x86_64
bekomme

Antworten:

344

Grundsätzlich müssen Sie arm64für die Simulatorarchitektur sowohl Ihr Projekt als auch das Pod-Projekt ausschließen.

  • Um das zu tun, Navigieren Sie zu Einstellungen beim Aufbau Ihres Projektes und fügen Sie Any iOS Simulator SDKmit dem Wert im arm64Innern Excluded Architecture.

    Geben Sie hier die Bildbeschreibung ein

ODER

  • Wenn Sie benutzerdefinierte XCConfigDateien verwenden, können Sie diese Zeile einfach hinzufügen, um die Simulatorarchitektur auszuschließen.
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64

Dann

Sie müssen dasselbe für das Pod-Projekt tun, bis alle Anbieter von Kakaopads die folgenden Informationen in ihrer Podspec hinzugefügt haben .

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

Sie können Excluded Architechuredie Build-Einstellungen Ihres Pod-Projekts manuell hinzufügen , sie werden jedoch bei Verwendung überschrieben pod install.

Stattdessen können Sie dieses Snippet in Ihr hinzufügen Podfile. Bei jeder Ausführung werden die erforderlichen Build-Einstellungen geschriebenpod 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
quelle
26
wow Mann! rettete meinen Tag und möglicherweise Nacht! Vielen Dank für eine so ausführliche Antwort.
Sandpat
3
Das zusätzliche Detail über CocoaPods hier ist schön. Beachten Sie, dass XCode Ihre Pods beim Erstellen eines tatsächlichen Geräts ohne [sdk=iphonesimulator*]After EXCLUDED_ARCHSnicht findet, da keiner der Pods für arm64 erstellt wird.
mwu
2
Hat für mich gearbeitet! Beachten Sie, dass es post_install do |installer|in den meisten Podfiles aufgrund von Flipper bereits einen Abschnitt gibt . Fügen Sie den inneren Bereich installer.pods_project.build_configurations.each do |config| config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" endhinter der flipper_post_install(installer)Linie ein.
Ramon Vermeulen
2
Ich bekomme building for iOS Simulator, but linking in object file built for macOS, for architecture x86_64. Wie man es repariert?
Sazzad Hissain Khan
2
Diese Lösung ist ausgezeichnet, und ich möchte hinzufügen, dass Sie, wenn Sie Ihre eigene Kapsel bauen, besonders die 2 Zeilen beachten, die der Autor nach "... bis alle Kakaofrucht-Anbieter ihre Podspec hinzugefügt haben" vorschlägt, da diese nicht vorhanden sind In meinem eigenen Framework verursachte Podspec Flusenfehler, als ich versuchte, es auf mein privates Repo zu übertragen. Vielen Dank!
Danny
75

TL; DR;

Setzen Sie "Nur aktive Architektur erstellen ( ONLY_ACTIVE_ARCH)" für Ihre Bibliotheken / Apps auf " Ja " , auch für den Release- Modus.


Beim Versuch, die Hauptursache des Problems zu identifizieren, wurden mir einige interessante Fakten über Xcode 12 klar.

  1. Xcode 12 ist eigentlich das Sprungbrett für Apple Silicon, das leider noch nicht verfügbar ist. Aber mit dieser Plattform werden wir arm64-basiertes MacOS bekommen, wo Simulatoren im Gegensatz zur gegenwärtigen Intel-basierten x86_64-Architektur auch auf arm64-Architektur laufen.

  2. Xcode hängt normalerweise vom "Ausführungsziel" ab, um seine Bibliotheken / Apps zu erstellen. Wenn also ein Simulator als "Ausführungsziel" ausgewählt wird, wird die App für verfügbare Simulatorarchitekturen erstellt, und wenn ein Gerät als "Ausführungsziel" ausgewählt wird, wird die für das Gerät unterstützte Architektur erstellt ( arm*).

  3. xcodebuildwird im Xcode 12+ Build-System arm64als gültige Architektur für den Simulator betrachtet. Wenn also ein Simulator als Ausführungsziel ausgewählt wird, kann er möglicherweise versuchen, Ihre Bibliotheken / Apps auch mit arm64basierten Simulatoren zu kompilieren / zu verknüpfen (noch nicht verfügbar). Es sendet clang(++)also ein Zielflag wie arm64-apple-ios13.0-simulatorim Format <Architektur> - <os> - <sdk> - <Plattform> und Clang versucht, einen arm64-basierten Simulator zu erstellen / zu verknüpfen, der schließlich auf einem Intel-basierten Mac fehlschlägt.

  4. Aber xcodebuildversucht , dies nur für Veröffentlichung baut. Warum? Da die Build- ONLY_ACTIVE_ARCHEinstellungen für " Nur aktive Architektur erstellen ( )" normalerweise nur für die Konfiguration "Release" auf "Nein" gesetzt sind. Das bedeutet, xcodebuilddass versucht wird, alle Architekturvarianten Ihrer Bibliotheken / Apps für das ausgewählte Ausführungsziel für Release-Builds zu erstellen. Und für das Simulator-Ausführungsziel wird es beides enthalten x86_64und arm64jetzt, da arm64in Xcode 12+ auch eine Architektur für Simulatoren zur Unterstützung von Apple Silicon unterstützt wird.

Einfach ausgedrückt, Xcode kann Ihre App nicht jedes Mal erstellen, wenn es die Befehlszeile versucht xcodebuild(standardmäßig wird Build veröffentlicht, siehe die allgemeine Registerkarte Ihrer Projekteinstellung) oder auf andere Weise im Release- Modus. Eine einfache Problemumgehung für dieses Problem besteht darin, "Nur aktive Architektur erstellen ( ONLY_ACTIVE_ARCH)" in Ihren Bibliotheken / Apps auf " Ja " zu setzen , auch für den Release-Modus.

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Wenn die Bibliotheken als Pods enthalten sind und Sie Zugriff darauf haben .podspec, können Sie einfach Folgendes festlegen:

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

spec.user_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'YES'} # nicht empfohlen

Ich persönlich mag die zweite Zeile nicht, da Pods das Zielprojekt nicht verschmutzen sollten und es in den Zieleinstellungen selbst überschrieben werden könnte. Es sollte also in der Verantwortung des Verbraucherprojekts liegen, die Einstellung auf irgendeine Weise außer Kraft zu setzen. Dies kann jedoch für ein erfolgreiches Flusen von Podspecs erforderlich sein.

Wenn Sie jedoch keinen Zugriff auf die haben .podspec, können Sie die Einstellungen während der Installation der Pods jederzeit aktualisieren:

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

Ich war besorgt darüber, welche Auswirkungen dies haben wird, wenn wir die Bibliotheken / Apps tatsächlich archivieren. Während der Archivierung nehmen Apps normalerweise die "Release" -Konfiguration an. Da hierdurch ein Release-Build erstellt wird, der nur die aktive Architektur des aktuellen Ausführungsziels berücksichtigt, verlieren wir bei diesem Ansatz möglicherweise die Slices für armv7, armv7s usw. aus dem Ziel-Build. Ich habe jedoch festgestellt, dass in der Dokumentation (im beigefügten Bild hervorgehoben) angegeben ist, dass diese Einstellung ignoriert wird, wenn "Generisches iOS-Gerät / Beliebiges Gerät" als Ausführungsziel ausgewählt wird, da keine bestimmte Architektur definiert wird. Ich denke, wir sollten gut sein, wenn wir unsere App archivieren und dies als Laufziel auswählen.

Ayan Sengupta
quelle
20
Dies ist die erste Antwort, die mein Verständnis des Problems verbessert hat, anstatt nur zu sagen "Ändern Sie diese drei Build-Einstellungen und vielleicht funktioniert es". Vielen Dank für die Zeit, die Sie in das Schreiben gesteckt haben!
Epologee
1
Dies ist wirklich eine überraschende Änderung von Apple und hat mich einen halben Tag gekostet, um herauszufinden, dass Apple dies meiner Meinung nach kompensieren sollte :). Dies ist kein dokumentiertes Update (zumindest wie ich weiß) und wird sicherlich jeden betreffen, der auf Xcode 12 aktualisiert. Ich hoffe nur, dass jeder seinen eigenen Weg findet, um damit fertig zu werden, sobald er die Grundlagen kennt.
Ayan Sengupta
1
Wenn mehrere Pod-Spezifikationen verwendet werden user_target_xcconfigund die Werte nicht genau übereinstimmen, gibt CocoaPods Warnungen wie diese aus. [!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values.Die Podspec-Syntaxreferenz besagt, dass dieses Attribut "nicht empfohlen" wird. Guides.cocoapods.org/syntax/podspec.html#user_target_xcconfig . Verwenden Sie dies also nicht user_target_xcconfig, um vielen Entwicklern die Mühe zu ersparen.
leberwurstsaft
2
Richtig! Und ich glaube, ich habe das bereits in meiner Antwort erwähnt.
Ayan Sengupta
2
Ich habe es am Ende geschafft, alles mit 'EXCLUDED_ARCHS [sdk = iphonesimulator *]' => 'arm64' zum Laufen zu bringen, aber nur in pod_target_xcconfig und nur auf dem Problem-Pod (der eine vorgefertigte Bibliothek enthielt) und dem einzelnen Pod, der davon abhing das Problem pod. Alles andere wurde sauber gelassen. Ich entschied, dass ich das der aktiven Bogenlösung vorzog.
Airsource Ltd
65

Eine Lösung gefunden! https://developer.apple.com/forums/thread/657913

Wenn Sie ausgeschlossene Architekturen für den Simulator auf arm64 setzen, wird er kompiliert.

ohne Architekturen für den Simulator

SlashDevSlashGnoll
quelle
5
Ich glaube nicht, dass dies eine Lösung ist. Dies führt zu einem Problem mit dem Schritt nach dem Erstellen der Cocoapods mit dem von ihnen installierten Skript. Pods / Zielunterstützungsdateien / Pods-All-Apps-XXX / Pods-All-Apps-XXX-frameworks.sh: Zeile 141: ARCHS [@]: ungebundene Variable Dies ist eine Methode, die versucht, ungültige Architekturen zu entfernen Der Build kann immer noch nicht abgeschlossen werden. Selbst dann ist das Ausschließen von arm64 eine vorübergehende Korrektur, die die Sim möglicherweise zum Laufen bringt, das Build-Problem jedoch nicht behebt.
Btxios
Fairerweise hatte ich ein Problem mit einer manuell verknüpften Bibliothek, aber es verursachte auch kein Problem mit unseren Pods, die wir verwenden.
SlashDevSlashGnoll
3
Ich habe im Release- Modus getestet, also musste ich es auch zum Release hinzufügen
MujtabaFR
Ich denke, wir sind nach diesem Beitrag wieder im Geschäft. Danke, es hat geholfen.
JBarros35
Das funktioniert bei mir! Vielen Dank.
Arshad
42

Xcode 12, Beta 6

Die Build-Einstellung "Gültige Architekturen" wurde in Xcode 12 entfernt. Wenn Sie Werte in dieser Build-Einstellung hatten, verursachen diese ein Problem und müssen entfernt werden.

Ich konnte die Build-Einstellung VALID_ARCHS "löschen", indem ich sie wieder als benutzerdefinierte Build-Einstellung (ohne Werte) hinzufügte, das Projekt ausführte (was fehlgeschlagen ist) und dann die Build-Einstellung VALID_ARCHS löschte. Danach konnte ich auf dem Simulator laufen.

Die Build-Einstellung "Meine Architekturen" lautet "Standardarchitekturen".

Sie können eine benutzerdefinierte Einstellung über die Plus-Schaltfläche in den Build-Einstellungen hinzufügen:

Benutzerdefinierte Einstellung

Trishcode
quelle
7
Dies sollte die akzeptierte Antwort sein. Stellen Sie sicher, dass das App-Projekt ausgewählt ist und nicht das Ziel. Andernfalls können Sie VALID_ARCHS nicht aus den Build-Einstellungen löschen. :)
Bionicle
1
@trishcode Auch danach erhalte ich den gleichen Fehler (xcode12 beta4), alle
Workarounds
3
@SivakrishnaPerla Wenn Sie das Projekt in Xcode 11 öffnen können, können Sie genau sehen, auf welchen Zielen gültige Architekturen verwendet werden. Sie können sogar die Einstellung in Xcode 11 löschen und das Projekt dann in Xcode 12 erneut versuchen. Wenn Sie immer noch eine Problemumgehung benötigen und der Fehler in einem eingebetteten Framework angezeigt wird, sollte die Antwort von SlashDevSlashGnoll funktionieren. Wenn Sie eine Problemumgehung benötigen und der Fehler auf einem Cocoapod angezeigt wird, schließen Sie die arm64-Architektur in der Podfile-Nachinstallation aus.
Trishcode
1
@trishcode Danke, das Setzen von arm64 in der ausgeschlossenen Architektur und das Entfernen von VALID_ARCHS hat funktioniert.
Sivakrishna Perla
1
Wenn ich VALID_ARCHS entferne und arm64 zur ausgeschlossenen Architektur hinzufüge, wird folgende Fehlermeldung angezeigt: - Abhängigkeiten prüfen Keine zu kompilierenden Architekturen (ARCHS = arm64 x86_64, VALID_ARCHS =, EXCLUDED_ARCHS = (arm64)).
nOOb iOS
9

Wenn Sie in Xcode 12 Probleme mit Simulatoren haben, die kein echtes Gerät sind, müssen Sie die VALID_ARCHS- Einstellungen entfernen , da dies nicht mehr unterstützt wird. Gehen Sie zu "Einstellungen erstellen ", suchen Sie nach " VALID_ARCHS " und entfernen Sie die benutzerdefinierten Eigenschaften. Mach es in jedem Ziel, das du hast.

Möglicherweise müssen Sie jedoch unten in Ihrer Poddatei ein Skript hinzufügen, damit Pods mit der richtigen Architektur und dem richtigen Bereitstellungsziel kompiliert werden:

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
quelle
Das Entfernen von VALID_ARCHSaus meinem Projekt hat gut funktioniert. Ich habe weder an der Poddatei noch am Pods-Projekt etwas geändert.
Ángel Téllez
7

Nach dem Upgrade auf Xcode 12 konnte ich noch für ein echtes Gerät bauen, aber nicht für den Simulator. Der Podfile-Build funktionierte nur für das reale Gerät.

Ich habe VALID_ARCHS unter Build-Einstellungen> Benutzerdefiniert gelöscht und es hat funktioniert! Ich habe mir einige Zeit den Kopf geschlagen, bevor ich das gefunden habe.

Navigator
quelle
6

Ich glaube, ich habe die Antwort gefunden. Gemäß den Versionshinweisen zu Xcode 12 Beta 6:

" Der Editor für Build-Einstellungen enthält nicht mehr die Build-Einstellung für gültige Architekturen (VALID_ARCHS), und von deren Verwendung wird abgeraten. Stattdessen gibt es eine neue Build-Einstellung für ausgeschlossene Architekturen (EXCLUDED_ARCHS). Wenn ein Projekt VALID_ARCHS enthält, wird die Einstellung im Benutzer angezeigt -Definierter Abschnitt des Build-Einstellungs-Editors. (15145028) "

Ich konnte dieses Problem beheben, indem ich die Projektdatei manuell bearbeitete (ich konnte nicht herausfinden, wie das Element mit Xcode aus der Projektdatei entfernt werden kann) und alle Zeilen entfernte, die auf VALID_ARCHS verweisen. Danach kann ich gut für den Simulator bauen.

btxios
quelle
1
Unter Verwendung von Xcode befindet sich VALID_ARCHS in Projekt auswählen (nicht Ziel) und dann "Build-Einstellung -> Benutzerdefiniert". Wählen Sie es aus und löschen Sie es.
Akshay
Diese Lösung hat bei mir funktioniert. Die von einigen anderen vorgeschlagene Lösung funktionierte nicht, da nur das Hinzufügen des Werts 'arm64' zum Feld 'Architektur ausschließen' einen Fehler 'Dateiberechtigung' für die generierte .app-Datei verursachte.
Archaeopetrix
5

Ich löse das Problem, indem ich "arm64" in "Ausgeschlossene Architekturen" sowohl für das Projektziel als auch für das Pod-Ziel hinzufüge.

Xcode -> Zielprojekt -> Build-Einstellung -> Ausgeschlossene Architekturen> "arm64"

Xcode -> Pod-Ziel -> Build-Einstellung -> Ausgeschlossene Architekturen> "arm64"

Vader
quelle
5

In Ihrer xxx.framework-Podspec-Datei add follow config vermeiden, dass das Pod-Paket arm64-Similator-Bögen enthält

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
Jiawei Wang
quelle
Es funktionierte! Dies bedeutet jedoch, dass der Pod nicht in Apple Silicon-basierten Macs verwendet werden kann.
Tomacco
Ist es @tomacco bestätigt?
Fernando Reynoso
1
@FernandoReynoso Ich habe gerade ein Developer Transition Kit (ARM MacMini) erhalten, das ich heute testen und berichten werde
Tomacco
@tomacco Konntest du es testen?
Houman
Wenn mehrere Pod-Spezifikationen verwendet werden user_target_xcconfigund die Werte nicht genau übereinstimmen, gibt CocoaPods Warnungen wie diese aus. [!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values.Die Podspec-Syntaxreferenz besagt, dass dieses Attribut "nicht empfohlen" wird. Guides.cocoapods.org/syntax/podspec.html#user_target_xcconfig . Verwenden Sie dies also nicht user_target_xcconfig, um vielen Entwicklern die Mühe zu ersparen.
leberwurstsaft
5

Xcode 12

Das Entfernen VALID_ARCHaus den Build-Einstellungen unter Benutzerdefinierte Gruppenarbeit für mich.

Geben Sie hier die Bildbeschreibung ein

Pratik Sodha
quelle
4

Bei mir hat folgende Einstellung funktioniert:

Build-Einstellungen >> Ausgeschlossene Architekturen

"arm64" wurde sowohl zum Release- als auch zum Debug-Modus für die Option "Any iOS Simulator SDK" hinzugefügt.

Geben Sie hier die Bildbeschreibung ein

Raghav
quelle
3

Für Pod-Entwickler Fügen Sie in Ihrer Podspec Folgendes hinzu:

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

Dann in Ihrem Beispielprojekt Beispieleinstellungen für Projektdateien

Sehen Sie, wie es in diesem Projekt funktioniert

Pacu
quelle
Wenn mehrere Pod-Spezifikationen verwendet werden user_target_xcconfigund die Werte nicht genau übereinstimmen, gibt CocoaPods Warnungen wie diese aus. [!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values.Die Podspec-Syntaxreferenz besagt, dass dieses Attribut "nicht empfohlen" wird. Guides.cocoapods.org/syntax/podspec.html#user_target_xcconfig . Verwenden Sie dies also nicht user_target_xcconfig, um vielen Entwicklern die Mühe zu ersparen.
leberwurstsaft
3

Ich hatte Probleme beim Erstellen von Frameworks über die Befehlszeile. Mein Framework hängt von anderen Frameworks ab, denen die Unterstützung für ARM-basierte Simulatoren fehlte. Am Ende habe ich die Unterstützung für ARM-basierte Simulatoren ausgeschlossen, bis ich meine Abhängigkeiten aktualisiert habe.

Ich brauchte das EXCLUDED_ARCHS=arm64Flag, um das Framework für Simulatoren aus der CLI zu erstellen.

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
quelle
1
Hier gilt das gleiche. Das wichtigste "Problem" in diesem Szenario ist das Erstellen eines generischen Ziels über -destination "generic/platform=iOS Simulator". Dies führt zum Erstellen aller verfügbaren Architekturen, einschließlich arm64 seit Xcode 12.
Sascha
3

Nachdem ich fast jeden Beitrag in diesem Thread ausprobiert und die Apple-Entwicklerforen durchgelesen hatte, stellte ich fest, dass nur eine Lösung für mich funktionierte.

Ich baue ein universelles Framework auf, das in einer schnellen App verwendet wird. Ich konnte ohne Architekturfehler nicht auf den Simulator bauen.

In meinem Framework-Projekt habe ich in meinen Erstellungsphasen eine Universal Framework-Aufgabe, falls dies bei Ihnen der Fall ist

  • Fügen Sie Ihrer xcodebuildAufgabe in der Erstellungsphase Folgendes hinzu : EXCLUDED_ARCHS="arm64"

Als nächstes müssen Sie das folgende Projekt ändern Build Settings:

  • Löschen Sie die VALID_ARCHSbenutzerdefinierte Einstellung
  • Set ONLY_ACTIVE_ARCHan YES***

*** Wenn Sie ein Framework entwickeln und auch eine Demo-App haben, muss diese Einstellung in beiden Projekten aktiviert sein.

Willhess
quelle
2

Updates: Okt 2020

Sie können einfach arm64nur Debug > Simulator - iOS 14.O SDKunter Ausgeschlossene Architektur festlegen .

Geben Sie hier die Bildbeschreibung ein

Sunil Targe
quelle
1

Das Problem hierbei sind die gültigen Architekturen in Xcode 11, öffnen Sie das Projekt in Xcode 11 und ändern Sie den Wert für gültige Architekturen in $ (ARCHS_STANDARD) für Ihr Projekt, Ihr Ziel und Ihre Pods. Öffnen Sie das Projekt erneut in Xcode 12 und erstellen Sie es

user4478383
quelle
1

Setzen Sie die "Build Active Architecture Only"(ONLY_ACTIVE_ARCH)Build-Einstellung auf yes und xcodefragen Sie nach arm64, da die Silicon MAC-Architektur arm64 ist.

arm64 wurde als Simulatorbogen in Xcode12 hinzugefügt, um Silicon MAC zu unterstützen.

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

Aravind
quelle
Wenn es nicht auf einem Silicon Mac läuft, sollte es doch sicher wissen, dass arm64 nicht verwendet wird?
Jonathan.
@ Jonathan. Ja, es hätte so gemacht werden sollen, aber momentan ist es nicht so.
Aravind
1

In meinem Fall: Xcode 12

Ich setze leere Werte auf EXCLUDED_ARCHSund setze ONLY_ACTIVE_ARCHDebug = YESRelease = NO Build-Einstellung des Projekts

und ich habe dies in mein Podfile aufgenommen:

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

Es läuft auf meinem Simulator iPhone 8 (iOS 12) und iPhone 11 Pro Max (iOS 14) sowie auf meinem Gerät iPhone 7 Plus (iOS 13.4).

mitchy_dev
quelle
1

Bei der Build SettingsSuche VALID_ARCHdrücken Sie dann delete. Dies sollte bei mir mit Xcode 12.0.1 funktionieren

VALID_ARCH bei Build-Einstellungen

Cuong Lam
quelle
1
Ich finde nicht VALID_ARCH, was ist das?
Houman
1

Nur Any iOS Simulator SDK -> x86_64zu Project's Build Settings -> VALID_ARCHSArbeiten für mich hinzufügen .

Xcode-Version: 12.1 (12A7403)

Geben Sie hier die Bildbeschreibung ein

Wenn Ihr Projekt einige Frameworks enthält, die x86_64 nicht unterstützen.

  • Sie können diese Framework-Namen ( xxx.framework) hinzufügen Target -> Build Settings -> Excluded Source File Names -> Debug -> Any iOS Simulator SDK.
  • Und ändern Sie dann die Framework Search Paths, um die Pfade dieser Frameworks für zu löschen Debug -> Any iOS Simulator SDK.

Diese beiden Einstellungen können verhindern, dass Xcode diese Frameworks im Simulatormodus erstellt und verknüpft.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Daemonson Dong
quelle
1

Ich verstehe das Problem mit arm64 und Xcode 12 und konnte Build-Probleme beheben, indem ich die arm64-Architektur für iPhone Simulator ausschloss oder ONLY_ACTIVE_ARCH für das Release-Schema festlegte. Ich habe jedoch immer noch Probleme, mein Framework mit Pod Repo Push zu pushen.

Ich habe herausgefunden, dass die Einstellung s.pod_target_xcconfig in meiner Podspec diese Einstellung nicht auf Abhängigkeiten anwendet, die in derselben Podspec definiert sind. Ich kann es im Dummy-App-Projekt sehen, das Cocoapods während der Validierung generiert. Bei der Cocoapods-Validierung wird das Release-Schema für den Simulator ausgeführt. Dies schlägt fehl, wenn eine oder mehrere Abhängigkeiten arm64 nicht ausschließen oder nicht so eingestellt sind, dass nur eine aktive Architektur erstellt wird.

Eine Lösung könnte darin bestehen, Cocoapods zu zwingen, während der Validierung des Projekts ein Nachinstallationsskript hinzuzufügen, oder es das Debug-Schema erstellen zu lassen, da das Debug-Schema nur eine aktive Architektur erstellt.

Am Ende habe ich Xcode 11 verwendet, um meinen Pod freizugeben und die Validierung zu bestehen. Sie können Xcode 11 von developer.apple.com herunterladen, als Xcode11.app in den Anwendungsordner kopieren und mit wechseln sudo xcode-select --switch /Applications/Xcode11.app/Contents/Developer. Vergessen Sie nicht, zurückzuschalten, wenn Sie fertig sind.

Rudolf Kopřiva
quelle
1

Ich hatte auch das gleiche Problem mit einer bestimmten Bibliothek, die über Karthago installiert wurde. Für diejenigen, die Karthago verwenden, wird dieses Dokument durch eine Problemumgehung geführt, die in den meisten Fällen funktioniert, da Karthago mit Xcode 12 nicht sofort funktioniert. Nun, in Kürze erstellt Karthago fette Frameworks, was bedeutet, dass das Framework Binärdateien für alle unterstützten Architekturen enthält. Bis zur Einführung von Apple Sillicon hat alles einwandfrei funktioniert, aber jetzt gibt es einen Konflikt, da es doppelte Architekturen gibt (arm64 für Geräte und arm64 für Simulator). Dies bedeutet, dass Karthago architekturspezifische Frameworks nicht mit einem einzigen Fat Framework verknüpfen kann.

Sie können den Anweisungen hier folgen. Karthago XCODE 12

Dann, nachdem Sie das Karthago konfiguriert haben. Fügen Sie den arm64 in den Build-Einstellungen unter "Ausgeschlossene Architekturen" ein. Geben Sie hier die Bildbeschreibung ein

Versuchen Sie, Ihr Projekt mit dem Simulator auszuführen. Der Simulator sollte fehlerfrei laufen.

vidalbenjoe
quelle
0

In meinem Fall:

Ich hatte 4 Konfigurationen (+ DebugQa und ReleaseQa) Cocoapods wird als Abhängigkeitsmanager verwendet

Für das Debuggen habe ich auf dem Gerät und im Simulator und auf qa nur auf dem Gerät gesammelt.

Es hat geholfen, BuildActiveArchitecture in PodsProject auf yes zu setzen

voragomod
quelle
0

In meinem Fall habe ich versucht, auf einem watchOS 7-Simulator im Relese-Modus zu laufen, aber der iOS 14-Simulator befand sich im Debug-Modus.

Das einfache Versetzen beider Sims in den Debug / Release-Modus löste das Problem für mich!

Cosmin
quelle
0

Schalten Sie die Build-Konfiguration wieder in den Debug-Modus oder aktivieren Sie Build Active Architecture Only sowohl für den Debug- als auch für den Release-Modus. Der Grund dafür ist, dass Ihre Bibliothek / Ihr Framework die neue Simulator-Architektur ARM64 nicht unterstützt (auf einem Mac mit Apple Silicon-Prozessor ausgeführt).

Tran Anh Khoa
quelle
0

Fügen Sie dem Pfad die Zeile "arm64" (ohne Anführungszeichen) hinzu: Xcode -> Projekt -> Build-Einstellungen -> Architekturen -> Ausgeschlossene Architekturen Machen Sie dasselbe für Pods. In beiden Fällen sowohl für Debug- als auch für Release-Felder.

oder im Detail ...

Die hier erwähnten Fehler bei der Bereitstellung im Simulator mit Xcode 12 sind auch eines der Dinge, die mich betroffen haben. Klicken Sie einfach mit der rechten Maustaste auf jedes meiner Projekte und zeigen Sie es im Finder an. Öffnen Sie das .xcodeproj in Atom, gehen Sie das .pbxproj durch und entfernen Sie alle VALIDARCHS-Einstellungen. Das hat es für mich zum Laufen gebracht. Versuchte einige der anderen Vorschläge (außer arm64, Build Active Architecture Only), die meinen Build weiter zu bringen schienen, mich aber letztendlich bei einem anderen Fehler zurückließen. Wenn VALIDARCH-Einstellungen herumliegen, ist es wahrscheinlich das Beste, zuerst nachzusehen.

Sohaib Aslam
quelle
0

Teilen Sie die Lösung, die für mich funktioniert hat und die jemandem helfen kann

Problem beim Kompilieren für den Simulator:

Erstellen für iOS Simulator, aber Verknüpfen in einer für iOS erstellten Objektdatei für die Architektur arm64

XCODE 12.1, POD 1.9.1

Meine Projektstruktur

  • Hauptziel
  • Share-Erweiterung
  • Erweiterung des Benachrichtigungsdienstes
  • Submodul, benutzerdefiniertes Framework
  • Podfile
  1. In arm64aufzubauen Einstellungen -> Exclude Architecturein allen Zielen.

Geben Sie hier die Bildbeschreibung ein

  1. arm64Von allen Zielen entfernt VALID_ARCHSund hinzugefügt x86_64.

Geben Sie hier die Bildbeschreibung ein

  1. Fügen Sie folgenden Code hinzu podfile

    post_install do |installer|
        installer.pods_project.build_configurations.each do |config|
        config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
     end
    end
    
  2. Hat pod update, gelöscht podfile.lockund getanpod install

  3. Sauber bauen.

Gokul G.
quelle
0

Nachdem ich viele nutzlose Antworten online ausprobiert habe. Das funktioniert bei mir.

Generiert zunächst x86_64 für Pod-Projekte !!!!

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

Zweitens fügen Sie "x86_64" für VALID_ARCHS hinzu

Geben Sie hier die Bildbeschreibung ein

YanXing Ou
quelle
0

Er arbeitete für mich , als ich eingestellt $(ARCHS_STANDARD)für VALID_ARCHSfür Debug für jeden SDK iOS Simulator. Auch habe ich eingestellt YESfür ONLY_ACTIVE_ARCHfür Debug.

Geben Sie hier die Bildbeschreibung ein

Nikaaner
quelle
-2

Damit dies für automatisierte Calabash-Tests funktioniert

Es gibt eine Pull-Anfrage, um das Problem zu beheben, dass xcode 12 nicht mit Calabash https://github.com/calabash/run_loop/pull/757 funktioniert

Eine vorübergehende Lösung besteht darin, diesen WIP-Zweig zu verwenden, obwohl es nicht großartig ist, ihn verwenden zu müssen, da es sich um einen PR-Entwurf handelt. Die Xcode 12-Unterstützung für Calabash wird hoffentlich in Zukunft verfügbar sein.

Ändern Sie in Ihrem Gemfile

gem "run_loop"

zu

gem 'run_loop', git: 'https://github.com/calabash/run_loop.git', branch: 'xcode_14_support'
svnm
quelle