2012-09-19 9 views
17

Ich arbeite an einer iPhone-Anwendung mit openCV-Framework. Alles hat gut funktioniert. aber in letzter Zeit mit der Veröffentlichung von iOS 6 und XCode 4.5 Ich war die Migration meines Projektes 4.5 Xcode Beim Bau ich diesen Fehler aufgetreten:OpenCV.Framework kompiliert nicht für die armv7s Architektur

ld: file is universal (2 slices) but does not contain a(n) armv7s slice: /Users/jobs/iPhone_Client/workspace/MyProject/third-party/OpenCV.framework/OpenCV for architecture armv7s clang: error: linker command failed with exit code 1 (use -v to see invocation)

** BUILD FAILED **

The following build commands failed: Ld build/MyProject.build/Debug-iphoneos/MyProject.build/Objects-normal/armv7s/MyProject normal armv7s (1 failure)

Wie ich verstand dies auf die neuen armv7s Architektur beruht. OpenCV ist anscheinend nicht kompiliert mit armv7s.

Wie kann ich dieses Problem beheben?

Wo finde ich eine neue Version des Frameworks, das mit der Architektur von armv7s kompatibel ist?

Und wenn es kein kompatibles Framework gibt, gibt es eine Möglichkeit, den Quellcode zu erhalten und eine eigene Bibliothek zu erstellen, die mit der neuen Architektur kompiliert wird? Vielleicht ein paar schnelle Schritte, wie es geht?

Hinweis: Just zu beachten, dass ich den Build für armv7s brauchen nicht ARMv7. Vielen Dank

+0

Ich habe das gleiche Problem mit einer älteren Version des RestKit-Framework. Es gibt eine neue Version, die von RestKit zur Verfügung gestellt wird, nur das erfordert eine Menge Änderungen im Code, der das Framework verwendet. Wenn ich etwas finde, werde ich es dich wissen lassen. –

+0

http://stackoverflow.com/questions/9539617/iphone-opencv-libraries-built-for-armv7 – Ken

+0

@Ken ja ich habe dieses verwendet, bis die neue Architektur herauskam. Ich brauche es für Armv7s die Verbindung, die für armv7 (ohne die s) – Youssef

Antwort

15

Diese Antwort basiert auf der von n9986 angegebenen Antwort. Da schlug er vor, geklont ich das Repository bei

https://github.com/jonmarimba/OpenCV-iOS

gefunden Wenn ich es mehrere Referenzen innerhalb des Projekts auf verschiedenen Bibliotheken heruntergeladen wurden gebrochen, die seltsam war, aber sie waren einfach zu beheben. Nachdem sie repariert worden waren, verhielt es sich genau wie n9986 beschrieben und gab Bibliotheken aus, die für armv7 und armv7s kompiliert wurden. Für meine Zwecke benötigte ich jedoch, dass sie in ein .framework gebündelt werden, so dass sie ein Ersatz für das alte .framework sein könnten, das ich verwendet habe.

Zuvor hatte ich die neueste Version von Opencv für ios here heruntergeladen und verbrachte ziemlich viel Zeit damit, ihre cmake-Dateien zu modifizieren, um mit Unterstützung für armv7s zu kompilieren. jonmarimba hat die xcode-Projektdatei bereits restrukturiert, um ihre CMake-Abhängigkeiten zu entfernen, wodurch die Zielarchitektur viel intuitiver wird. Leider baut er nicht so viele Bibliotheken wie der Standard-openCV-Build. Ich habe ein neues Ziel zu jonmarimbaras Projekt für opencv_world hinzugefügt, welches das Ziel ist, das in der Standardversion von openCV für die Umwandlung in ein Framework verwendet wird. Sobald das erstellt wurde, habe ich es als Ersatz für die statische Bibliothek in der Framework-Dateistruktur verwendet, die von der Standardversion von openCV generiert wurde.

Das von mir erstellte Framework kann heruntergeladen werden here. Es funktioniert perfekt für mich als Ersatz für mein bisheriges opencv2.framework. Ich habe jedoch bemerkt, dass jonmarimba die Ziele für opencv_vipetab, opencv_stitching oder opencv_nonfree nicht konvertiert hat. Es ist möglich, dass bei Verwendung einer dieser Bibliotheken mein Framework nicht für Sie funktioniert. Wenn das der Fall ist, lassen Sie es mich wissen und ich kann versuchen, diese als Ziele im xcode-Projekt für Sie einzurichten.

aktualisieren

für andere Architekturen kompilieren, die Zielarchitektur auf das, was Sie für die opencv_world Bibliothek wie in der mitgelieferten Xcode-Projekt ändern. Nachdem Sie es erstellt haben, suchen Sie die Bibliothek, die Sie gerade erstellt haben. Benennen Sie die opencv_world-Bibliothek in opencv2 um und ersetzen Sie die Bibliotheksdatei im .framework durch opencv_world.

Update2

OpenCV 2.4.3 kompiliert nun mit armv7s Unterstützung standardmäßig, so dass diese Lösungen sind veraltet.

+0

+1 dafür. Danke, dass Sie den ganzen Weg zur Erstellung der .framework-Datei gemacht haben. Ich wurde bei diesem Schritt irgendwie faul. Dies sollte die Antwort sein. Ich wünschte, wir könnten das Kopfgeld teilen! –

+0

@ n9986 Ich weiß. Seine Antwort ist besser, seit er den ganzen Weg gegangen ist. Entschuldigung, ich kann das Kopfgeld nicht teilen, glauben Sie mir, ich habe es versucht. (http://meta.stackexchange.com/questions/2786/accept-multiple-answers-or-split-bounty-among-several-users). Danke trotzdem. – Youssef

+0

@ n9986 Ja, das wäre ein großartiges Feature, ich hätte es ohne deine Antwort nicht schaffen können, ich hatte schon eine lange Zeit verbracht, ohne irgendwohin zu kommen. Danke – Hammer

1

Sie können immer nur nicht zielarmv7s und nur zielarmv7. Ihre Anwendung wird auf dem iPhone 5 weiterhin einwandfrei funktionieren, sie wird jedoch nicht vollständig für den neuen Befehlssatz optimiert.

+0

Ich habe keine Kontrolle über den Build. Es ist ein automatisches Build-Skript, das auf einem Server ausgeführt wird. Ich kann nur meinen Code senden und es wird gebaut. Und das Skript verwendet das armv7s Framework – Youssef

+0

Dann jemand vor kurzem die Konfiguration des Servers geändert und Dinge gebrochen. Es liegt in ihrer Verantwortung, dies zu beheben. – Jim

0

Offensichtlich müssen Sie die Bibliothek openCV.framework neu kompilieren und neu erstellen und für armv7s als Ziel verwenden.

Passen Sie die Bibliothek "Projekteinstellungen" und "Zieleinstellungen" vor der Neuerstellung an. Viel Glück!

+0

Ich habe es versucht, aber wo finde ich das XCode-Projekt des openCV? – Youssef

7

Clone der Xcode-Projekt für opencv und aktualisieren Sie die opencv git Submodul gemäß der Readme:

https://github.com/jonmarimba/OpenCV-iOS

die Build-Einstellungen überprüfen, stellen Sie sicher, iOS6 und armv7s vorhanden sind. Klicken Sie auf Erstellen. Sie sollten jetzt die armv7s kompatible .a-Dateien haben. Ich habe es gerade versucht:

$ file libopencv_core.a 
libopencv_core.a: Mach-O universal binary with 2 architectures 
libopencv_core.a (for architecture armv7): current ar archive random library 
libopencv_core.a (for architecture cputype (12) cpusubtype (11)): current ar archive random library 

Der letzte Eintrag ist für armv7s nach meiner Forschung so weit.

Bearbeiten: Der letzte Eintrag ist in der Tat armv7s. Ich lief die eigenen Xcode Lipo Info-Befehl:

$ xcrun -sdk iphoneos lipo -info libopencv_core.a 
Architectures in the fat file: libopencv_core.a are: armv7 armv7s 
+0

Es steht so, aber es funktioniert nicht mit der Armv7s Architektur. gleicher Fehler wie oben. – Youssef

+0

Sie können dies auch mit den Bibliotheken versuchen: http://www.galloway.me.uk/2012/09/hacking-up-an-armv7s-library/ Sehen Sie, ob das funktioniert. Dies ist ein Weg, um es für einen erfolgreichen Build zu hacken, aber alle berichten über einen Erfolg bei dieser Methode. –

+0

@ n9986 toller Vorschlag, ich fand das auch, aber ich konnte es noch nicht zur Arbeit bringen. Sein Skript funktioniert und eine neue gültige Architektur wird der Bibliothek hinzugefügt, aber es gibt immer noch Fehler. Wenn Sie es geschafft haben, es zur Arbeit zu bringen, senden Sie bitte Details – Hammer

0

Pass -DCMAKE_OSX_ARCHITECTURES="armv6;armv7;armv7s;i386" cmake wenn OpenCV Bibliothek/Framework für iOS kompilieren.

+0

Haben Sie das verwendet und hatte es funktioniert? Es hat nicht für mich funktioniert. – Hammer

+1

Das hat am Ende wirklich für mich funktioniert. Ich musste diese Zeile in das Skript build_framework.py einfügen und ich habe ein Build OpenCV2.framework mit armv7, armv7s und i386 libs darin. (Ich brauche Armv6 nicht, also habe ich das entfernt.) – Liron

1

Einfach geklont Quelle von here und baue mit this tutorial.

Dann bekam ich opencv2.framewok, das mit armv7, armv7s und Simulator funktioniert.

Verwandte Themen