Frage Xcode 6.1: Datei wurde für x86_64 erstellt, die nicht die Architektur ist, die verlinkt wird (i386)


Ich habe ein Swift - Framework - Projekt für util / extensions erstellt, das a kompiliert und kopiert .framework Datei an einen bestimmten Ort auf meinem System. Ich möchte in der Lage sein, diese Datei in andere Projekte zu integrieren (Build Phases / Link Binary with Libraries). Das Framework-Projekt ist ein Cocoa Touch Framework-Typ-Projekt (wie aus dem Xcode 6.1-Projektvorlagenbrowser ausgewählt).

Aber wenn ich versuche, ein Projekt zu kompilieren, das die Framework-Datei verbindet, bekomme ich diese Warnung:

ld: warning: Datei ignorieren   /Users/name/Projects/Xcode/Libs/swiftutils.framework/swiftutils, Datei   wurde für x86_64 gebaut, was nicht die Architektur ist, die verlinkt wird   (i386):   /Users/name/Projects/Xcode/Libs/swiftutils.framework/swiftutils

Kann ich etwas mit dem Framework-Projekt machen, damit es für andere iOS-Projekte gültig ist? Es ist verwirrend, weil das Framework-Projekt ein Cocoa Touch Framework-Projekt ist, das natürlich mit anderen Cocoa Touch (d. H. IOS) -Projekten funktionieren sollte, oder?


33
2017-11-21 07:11


Ursprung


Antworten:


Stell sicher dass du hast i386 und x86_64 aufgeführt in Ihren Architekturen in Build-Einstellungen für Ihre lib. Auch eingestellt Nur aktive Architektur erstellen explizit zu Nein.


28
2017-11-21 07:26



Ich stieß auf dieses Problem und die aktuelle Lösung beseitigte den ursprünglichen Fehler (d. H. Ich konnte i386 nicht verbinden), aber verknüpfte Frameworks (wie Alamofire) konnten nicht in mein Projekt importiert werden. Die folgende Lösung behebt dieses Problem.

  1. In deinem Ziel Build Settings -> Architectures -> Valid Architectures, füge den Wert hinzu i386.

build settings

  1. Löschen Sie als Nächstes den Inhalt des abgeleiteten Datenordners Ihres Projekts. Der Inhalt dieses Ordners wird während der Erstellung generiert und kann sicher entfernt werden, und Xcode erstellt einen neuen Ordner. Um diesen Ordner in Xcode 8 zu löschen, gehen Sie zu File->Project/Workspace Settings, klicken Sie auf den grauen Pfeil, um den Ordner im Finder zu öffnen, und löschen Sie den Inhalt. derived data folder location

  2. Reinigen und neu aufbauen.

  3. Wenn der Build weiterhin fehlschlägt, überprüfen Sie den Problemnavigator auf etwas, das besagt Update to recommended settings. Klicken Sie darauf und versuchen Sie es erneut.
    Wenn Sie diese Option nicht sehen, ändern Sie sie Build Active Architecture Only zu Yes in Build-Einstellungen. Dies verlangsamt die Build-Zeiten, was frustrierend sein kann, wenn Sie häufig zwischen verschiedenen Geräten hin- und herwechseln.


7
2017-09-02 23:34



Während die akzeptierte Antwort das Problem gelöst hat, ist hier ein wenig mehr, da die Probleme über die Architektur, buchstäblich die Binärdateien, sind

1. Architektur in iOS

armv64: iPhoneX, iPhone 5s-8, iPad Air - iPad Pro

armv7: iPhone3Gs-5c, iPad WIFI (4. Generation)

armv6: iPhone - iPhone3G

das oben, wenn für reale Geräte

i386: 32-Bit-Simulator

x86_64: 64-Bit-Simulator

Die obige Liste ist abwärtskompatibel, was bedeutet, dass iPhoneX auch mit armv6 läuft und die Funktionen von armv64 nicht voll ausnutzen kann

Weitere Informationen zu iOS-Architekturen finden Sie hier: https://developer.apple.com/library/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html

2. Was ist Build Active Architecture Only?

Wenn Sie "Ja" auswählen, wird Ihr Framework nur auf das "ausgewählte Gerät", entweder echte Geräte (Armv) oder Simulator (x86_64 oder i386), gebaut. Für "Nein" wird Ihr Framework zu Ihrer Liste der "Gültigen Architekturen" hinzugefügt.

Standardmäßig ist es im Debug-Modus "Ja"; In der Version "more" ist es "No", was die Kompilierungszeit im Debug-Modus spart und dafür sorgt, dass Ihr release-Projektframework auf allen von Ihnen angegebenen Architekturen ausgeführt wird.

Deshalb hat die akzeptierte Antwort funktioniert, indem Sie das Framework gezwungen haben, für alle Architekturen zu bauen, aber wenn Sie mehr lesen, werden Sie wissen, was dahinter steckt und können definitiv Zeit bei der Erstellung Ihres Frameworks sparen. Natürlich, mehr Kontrolle in dir selbst.

Also, wenn Sie an einem Framework arbeiten und in ein anderes Projekt importieren wollen, wenn Sie das Framework mit kompilieren Nur aktive Architektur erstellen "Ja" mit Simulator (i386 oder x86_64)und dann mit Ihrem Projekt in Ihr Projekt importieren Nur aktive Architektur erstellen "Ja" mit ein echtes Gerät (armv), Sie werden diesen Fehler feststellen.

Blick auf die Fehlerbeschreibung:

Datei wurde für erstellt x86_64 was nicht die Architektur ist, die verbunden ist (i386) Impliziert, dass Sie Ihr Framework im 64-Bit-Simulator erstellen und das zusammengeführte Projekt mit dem 32-Bit-Simulator erstellen.

während ein häufiger wäre:

Framework-Datei wurde für erstellt x86_64 Das ist nicht die Architektur   verlinkt sein (Arm64):   Das bedeutet, dass Ihr Framework im Simulator integriert ist, während das zusammengeführte Projekt mit einem echten Gerät erstellt wird.

3. Extrahieren des Rahmens

Eine gängige Praxis wäre, klicken Sie mit der rechten Maustaste auf das Framework und wählen Sie Im Finder anzeigen, während die meisten Entwickler das behalten Finder öffnen, und das neu kompilierte Framework wird das alte ersetzen, ohne zu schließen Finder und wieder öffnen. Ja, es ist richtig, aber wenn Sie das Build-Zielgerät dazwischen schalten, werden die Frameworks dazu führen verschiedene Ordner. Manchmal denken Sie, Sie haben Ihr Framework kompiliert, aber es ist tatsächlich in einem anderen Ordner. Meine Vorschläge wären immer ausgewählt Im Finder anzeigen um zu verhindern, dass das von Ihnen importierte Framework nicht das neueste ist.

Die zwei verschiedenen Ordner: Debug-iphoneos und Debug-iphonesimulator enter image description hereenter image description here


4
2018-03-07 04:18



Ich habe außerdem festgestellt, dass ich, wenn Sie Frameworks über Cocoapods wie ich verwenden, zum Pods-Projekt gehen und Lösungen von @dogsgod und @darksinge für jedes Framework-Ziel im Pods-Projekt anwenden muss. Das heißt, ich musste Build nur für aktive Architekturen deaktivieren und X86_64 und i386 in gültigen Architekturen hinzufügen.


1
2018-04-12 21:19