2012-09-13 5 views
7

Mit dem iPhone 5 und anderen armv7s Geräte erscheinen jetzt Kompatibilitätsprobleme mit bestehenden (closed-source) 3rd-Party-Frameworks wie Flurry, die ohne diese neuere Architektur gebaut werden .Gibt es ein Compiler-Flag, um fehlende armv7s Architektur anzuzeigen

Eine Option ist zu warten, bis sie einen neuen Build freigeben, aber ich hatte gehofft, dass ein Compiler-Flag oder etwas, das ich in meinem Xcode-Projekt verwenden kann, den Linker wissen lassen würde, armv7s Architektur von diesem Framework zu erwarten, und benutze stattdessen den armv7. Gibt es so etwas?

+10

** Stapelüberlauf schließt oder löscht aufgrund von NDAs zwischen Drittanbietern keine Fragen **. Moderatoren sind nicht hier, um Vereinbarungen zwischen zwei separaten Dritten durchzusetzen. Unabhängig davon, ob es sich um eine NDA handelt oder nicht, wenn es sich um eine praktische, beantwortbare Frage handelt und die Stack Overflow-Qualitätsrichtlinien erfüllt sind, bleibt die Frage offen und nicht gelöst. – casperOne

+1

Hey Matt. Ich wollte euch nur ein kurzes Update geben, dass Flurry 4.0.3 mit Unterstützung für armv7s am Freitag, 14. September veröffentlicht hat. Es gab eine Folgeversion 4.0.4 gestern, 17. September, um einige Compilerwarnungen zu entfernen. –

+0

Danke, ich habe es Minuten nachdem es veröffentlicht wurde. – coneybeare

Antwort

10

Es ist nicht möglich, ein Framework zu laden, das die Zielarchitektur nicht enthält.

Sie können nur eine armv7 App versenden, bis die Frameworks aktualisiert sind. Die App wird weiterhin auf dem iPhone 5 funktionieren, nutzen Sie nicht die neuesten Leistungsoptimierungen.

Oder wenn Sie ohne das Framework auf der neuen Architektur leben könnten, könnten Sie es schwach verknüpfen. Aber dann müssen Sie Ihren Code einchecken, wenn er überall geladen wird, wo Sie Sachen aus dem Framework verwenden.

6

Früher gab es in GCC, allow_sub_type_mismatches, ein Linker-Flag, mit dem Sie ARM-Architekturversionen in verknüpften Bibliotheken mischen und abgleichen konnten, aber sie scheinen das in den letzten Versionen von Xcode weggenommen zu haben.

Allerdings kann dies tatsächlich auf eine andere Art und Weise gehackt werden; eine Kopie des Rahmens sehen sein Inhalt, öffnen Sie den eigentlichen Code-Bibliotheksdatei in der es in einem Hex-Editor, und Sie wie folgt ersetzen alle:

CEFAEDFE 0C000000 09000000 

zu

CEFAEDFE 0C000000 0B000000 

Was Sie Im Grunde geht es darum, den Header innerhalb jedes Code-Objekts zu ändern, um es als ARMv7s anstatt als ARMv7-Code zu identifizieren - die Befehlssätze sind abwärtskompatibel (oder scheinen es zumindest zu sein), also sollte es auch mit diesem Hack gut laufen Ich muss zugeben, dass wir das nicht sicher wissen werden, bis wir tatsächlich die Chance haben, es auf einem iPhone 5 zu testen.

Sobald Sie das Framework geändert haben, fügen Sie einfach beide Versionen zu Ihrem Projekt hinzu und verknüpfen Sie diese mit den entsprechenden Architekturen. Sie können möglicherweise auch ein neues einzelnes Framework erstellen, indem Sie lipo verwenden, um die geänderten und ursprünglichen Bibliotheken zusammenzuführen.

+2

Dies ist genau das, was ich getan habe und zeige, wie hier - http://www.galloway.me.uk/2012/09/hacking-up-an-armv7s-library/. – mattjgalloway

+0

Cool - optimiert den Prozess, um ein automatisiertes Skript zu erstellen, und eliminiert die Möglichkeit, versehentlich eine CEFAEDFE 0C000000 09000000 zu ändern, die nicht mit dem Mach-O-Header zusammenhängt. – Ertebolle

+1

Was meinst du mit "weggenommen in LLVM"? Es ist eine Linkerflagge, für den großen Prophet Zarquon willen! Nichts mit dem Compiler zu tun, und es funktioniert tatsächlich, obwohl es wahrscheinlich die schlechteste Möglichkeit ist, dieses Problem zu lösen (Hinweis: Der richtige Weg besteht darin, ARMv7s zu deaktivieren, indem Sie es aus der Build-Einstellung von Architectures entfernen). –