Die Datei wurde für ein Archiv erstellt, bei dem es sich nicht um die zu verknüpfende Architektur handelt (i386).

79

Ich muss eine statische Bibliothek erstellen. Ich möchte in meiner iPhone- und iPad-App verwenden. Wenn ich versuche, den Simulator auszuführen, werden Verknüpfungsfehler angezeigt. Ich bin neu in der iOS-Entwicklung. freundlich helfen;

ld: Warnung: Ignoriert die Datei /Users/valuelabs/Desktop/DruvaProject/libraries/libnetUtils.a. Die Datei wurde für ein Archiv erstellt, bei dem es sich nicht um die zu verknüpfende Architektur handelt. (i386) Undefinierte Symbole für die Architektur i386:
"_OBJC_CLASS _ $ _ netUtils", referenziert von : objc-class-ref in ViewController.o ld: Symbol (e) für Architektur nicht gefunden i386 clang: Fehler: Linker-Befehl mit Exit-Code 1 fehlgeschlagen (verwenden Sie -v, um den Aufruf anzuzeigen)

Ich habe versucht, i386 in den Architekturen hinzuzufügen. aber kein Glück

yarlg
quelle

Antworten:

77

Nachdem ich mit demselben Problem zu kämpfen hatte und alle akzeptierten Antworten zum Aktualisieren der Build-Einstellungen, Löschen des Linker-Suchpfads usw. befolgt hatte, entdeckte ich endlich eine Antwort, die für mich funktionierte.

Stellen Sie vor dem Erstellen sicher, dass Sie den richtigen Typ (iPhone Simulator) anstelle des iOS-Geräts auswählen. Dann wieder aufbauen. Andernfalls versuchen Sie, eine Bibliothek zu verwenden, die für ein iOS-Gerät (Armprozessor) auf einem Simulator auf Ihrem Mac (i386) erstellt wurde. Hätte offensichtlich sein sollen, war es aber nicht.

Vor:

iOS-Geräteeinstellungen

Nach:

iPhone 5.1 Simulator-Einstellungen

Schauen Sie nun in der Gruppe Produkte im Navigator nach> klicken Sie mit der rechten Maustaste auf Ihre statische Bibliothek (.a-Datei)> Im Finder anzeigen. Sie werden feststellen, dass sie sich in einem Debug-iphonesimulator-Ordner anstelle von Debug-iphoneos befindet. Ich habe ursprünglich nicht auf den Ordnernamen geachtet, sonst hätte ich vielleicht früher daran gedacht.

Hoffe das hilft.

Cody A. Ray
quelle
Das hat es für mich gelöst. Es gibt viele Möglichkeiten, eine Architektur zu erstellen, die Sie nicht beabsichtigen, und zukünftige Suchende möchten möglicherweise viele dieser Antworten durchsehen, um festzustellen, ob Sie auf die für Sie zutreffende stoßen!
Danny
Update: Nach xcode 5 und iPhone 64-Bit-Simulator habe ich einen Fehler mit libPods.a für eine andere Architektur erstellt, aber es passiert nicht in anderen Arten von Simulatoren: \
Nour1991
13
@ Nour1991 versuchen Einstellung Build Settings -> Build Active Architecture OnlyaufNo
MMiroslav
@MMiroslav Ich musste es auf Ja setzen, weil ich im Debug bereitstellen muss.
Pedro Romão
42

Manchmal irritieren Sie diese Art von Fehlern!

Das Entfernen abgeleiteter Daten funktioniert für mich:

Schritte zu beheben

1) In XCODE> Fenster> Projekt> Projekt auswählen> Löschen abgeleiteten Daten> Quit XCODE und erneut öffnen> Wenn Sie die MAC-O-Linker erhalten builed fehlgeschlagen Fehler> Refere diese link> Sauber und bauen wieder.

Gajendra K Chauhan
quelle
1
Informationen
Dan Carlson
28

Sie libnetUtils.awerden für eine andere Architektur als Ihr Ziel erstellt.

Überprüfen Sie die Build-Einstellungen von libnetUtils. Die Architekturen, für die es erstellt wird, und die Liste der unterstützten Architekturen müssen eine (schwache) Obermenge der Architektur Ihres Ziels sein. Die Komplexität besteht darin, dass die resultierende Architektur auf verschiedene Einstellungen verteilt ist: "Architekturen", "Nur aktive Architektur erstellen" und "Gültige Architekturen".

Die Einstellungen "Nur aktive Architektur erstellen" machen dies besonders verwirrend. Angenommen, Sie erstellen für den Simulator. Wenn die Einstellung "Nur aktive Architektur erstellen" für Debug auf NO gesetzt ist, werden alle unter "Architekturen" und "Gültige Architekturen" aufgeführten Architekturen (wahrscheinlich armv7 usw.) erstellt. Wenn libnetUtils diese Einstellung auf Ja gesetzt hat (Debug: Ja), wird sie nur für i386 erstellt. Wenn Ihr Linker versucht, armv7 mit i386 zu verknüpfen, schlägt dies fehl.

achow
quelle
26

Wenn ich die Warnung "Datei ignorieren" erhalte, würde ich eine ignorierte Datei ausführen lipo -info, um die folgende Architektur zu finden

lipo -info libnetUtils.a

Das würde entweder i386, armv6, armv7, armv7s, x86_64 usw. drucken. Im Allgemeinen muss diese Architektur mit Ihrer Ziel-Build-Plattform übereinstimmen. Z.B

  • i386 = iOS-Simulator oder 32-Bit-Build auf Mac OS X.
  • armv6 armv7 arm7s = ios Gerät
  • x86_64 = 64-Bit-Build auf Mac OS X.

Abhängig von der Nichtübereinstimmung müssen Sie entweder Ihre Bibliothek für Ihre Zielplattform neu erstellen oder Ihre Zielplattform ändern.

Hinweis: Bei fetten Binärdateien lipo -infowird eine Kombination der oben genannten Architekturen gedruckt.

Kiran
quelle
2
Dies beantwortete das OP jedoch nicht. Dies ist ein großartiges Tool zum Debuggen dieses Problems. Ich möchte wissen, wie Sie eine Binärdatei mit allen oben genannten Architekturen erstellen.
Jay Q.
Trotzdem habe ich die Antwort hier gefunden: stackoverflow.com/questions/2793392/…, bei dem Lipo verwendet wird, um Builds mit dem Flag '-create' zu kombinieren
Jay Q.
ld: Warnung: Erstellen für iOS-armv7, aber Versuch, eine Verknüpfung mit einer für iOS-arm64 erstellten Datei herzustellen Undefinierte Symbole für Architektur armv7 Diese Warnung führt zu clang: error: Linker-Befehl mit Exit-Code 1 fehlgeschlagen (verwenden Sie -v, um den Aufruf anzuzeigen) . Wenn Sie eine eigene Bibliothek / ein eigenes Framework verwenden, ändern Sie dies sowohl in der Projektbibliothek als auch in Adopter. Build-Einstellungen -> Aktive Architektur nur auf Nein
erstellen
Bitte beziehen Sie sich auf medium.com/@edisonlo/…
Shrikant Phadke
9

Ich weiß eigentlich nicht, ob mein Rat richtig ist, aber versuche dies zu überprüfen:

  • Wählen Sie Ihr Projekt aus
  • Wählen Sie "Build Settings"
  • Architekturen überprüfen:
    • Gültige Architekturen sollten "armv6 armv7" sein.
    • Unterstützte Plattformen sollten "iphonesimulator iphoneos" sein (vielleicht iPad, ich weiß nicht)
    • Basis-SDK - Ihr iOS-SDK (ich habe iOS 5.0).

Beurteile mich nicht, wenn ich offensichtlich Kapitän bin :)

Alexander Bekert
quelle
17
Zusätzlich zu Alexanders Rat würde ich empfehlen, dass Sie sicherstellen, dass die Einstellung "Nur aktive Architektur erstellen" auf "NEIN" gesetzt ist. Das hat mich vor kurzem gestolpert.
TPoschel
5

Dies bedeutet, dass die Bibliothek, die Sie verwenden möchten, nicht universell für den iOS-Simulator kompiliert wurde (i386-Symbole gelten für den Mac). Das Ausführen auf einem tatsächlichen Gerät sollte jedoch einwandfrei funktionieren.

CodaFi
quelle
3

Hatte das gleiche Problem und versuchte verschiedene Lösungen von der Seite ohne Erfolg. Ich hatte immer noch eine Nachricht, dass meine Bibliothek nicht für arm64 erstellt wurde.

Endlich, wie ich es gelöst habe:

  • öffnete die project.pbxproj für die Bibliothek in einem Texteditor
  • nach VALID_ARCHS gesucht
  • Es gab 4 Vorkommen, von denen 2 arm64 nicht enthielten
  • Ich habe arm64 manuell in die Kette eingefügt (VALID_ARCHS = "arm64 i386 armv7 armv7s")
  • Baue die Bibliothek wieder auf und es war alles in Ordnung

Es scheint, dass die von XCode angezeigten Build-Einstellungen manchmal unvollständig sind und nicht genau der Projektdatei entsprechen.

Eino Gourdin
quelle
2

Sie sollten auch überprüfen, ob das Bereitstellungsziel in den Build-Einstellungen für Abhängigkeiten und Abhängigkeiten identisch ist. Ich habe festgestellt, dass iOS 13 für ein statisches Bibliotheksziel festgelegt wurde, während iOS 10.0 für ein Framework definiert wurde, das diese Bibliothek verwendet. Durch Umschalten auf 10.0 wurde das Problem behoben.

GeRyCh
quelle
0

Für mich war es fixiert die Einstellung Build Active Architecture Onlyzu Multiple values, das zu tun, müssen Sie ihn und Expandieren Debugauf YESund Releasezu No. Und jetzt wird es auf meinem Gerät kompiliert.

JESERRANO
quelle
-1

Dieses Problem tritt nicht auf, wenn wir die Anwendung auf dem Gerät ausführen. Sie können dies überprüfen, indem Sie den Code auf einem iOS-Gerät ausführen.

Chandni - Systematix
quelle
-2

Ich hatte auch eine Architektur von armv7s. Ich habe es gelöscht und sichergestellt, dass armv6 und armv7 die einzigen sind, die aufgelistet sind. Es funktioniert jetzt

Flyer
quelle
Sie sollten armv7s nicht ausschließen
Maciej Swic