Cross-Compiling Nulomq zu Arm zur Verwendung in einer monotouch iPhone App Konfigurieren Sie Einstellungen

StackOverflow https://stackoverflow.com/questions/8318928

Frage

Ich versuche, die Zeromq -Bibliothek in einer iPhone -App zu verwenden, die mit Monotouch in C# entwickelt wurde. Ich habe fast alle Probleme gelöst, aber bei der letzten Hürde gefallen. Ich verwende ZeroMQ 2.1.10 und die C# CLR -Bindung/-verpackung und entwickelt sich in Mac OS X 10.6.8. Hier ist die bisherige Geschichte:

Ich habe zum ersten Mal versucht, Zeromq in einer einfachen Mono C# -Konsole -App zu verwenden. Ich habe Zeromq mit gebaut ./configure, dann make und sudo make install, die die gemeinsame Bibliothek installiert /usr/local/lib/libzmq.dylib. Die Nullenbindung clrzmq.dll ist eine Wrapper, die die "Core" -Seromq -Funktionalität über C API verwendet [DllImport] Anrufe.

Die Test -App hat nicht funktioniert, was ich als das Standard -Nullenmotor festgestellt habe ./configure Erzeugt eine 64-Bit-Ausgabe, und Mono beträgt nur 32 Bit. Ich habe dann Nulomq mit aufgebaut

./configure CFLAGS="-O -arch i386" CXXFLAGS="-O -arch i386" LDFLAGS="-arch i386" --disable-dependency-tracking

Meine einfache C# Zeromq -App hat dann richtig funktioniert.

Als ich weitermachte, versuchte ich dann, Zeromq in einer iPhone -App im iPhone -Simulator aus zu verwenden. Ich habe festgestellt, dass das iPhone nur staatlich verknüpfte Bibliotheken erlaubt (keine dynamischen Bibliotheken erlaubt). Dies wird erreicht, indem alle C# -Wrapper -Anrufe geändert werden auf

[DllImport("__Internal", CallingConvention = CallingConvention.Cdecl)]

und einschließlich libzmq.a Direkt im Monotouch -Projekt und Setzen Sie zusätzliche Mtouch -Argumente

-cxx -gcc_flags "-L${ProjectDir} -lzmq -force_load ${ProjectDir}/libzmq.a"

Um sicherzustellen, dass die Zeromq -Bibliothek in der iPhone -App enthalten ist.

Beim Ausführen der App im iPhone -Simulator ist sie abgestürzt, was ich auf einen Anruf aus einem zurückgeführt habe zmq_init() zu socketpair. Ich habe dies schließlich auf die Zeromq -Bibliothek zurückgeführt, die gegen die MacOS -Header und -Bibliotheken meiner Build -Maschine anstatt gegen das iPhone SDK gebaut worden war. Dies wurde durch fixiert von

./configure CFLAGS="-O -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk" CXXFLAGS="-O -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk" LDFLAGS="-arch i386" --disable-dependency-tracking

Erfolg im iPhone -Simulator! Der Simulator benötigt i386 statische Bibliotheken, die an der iPhone -Simulator -SDK erstellt wurden. Ich kann jetzt Nulomq -Funktionalität in einer iPhone -App nur im Simulator verwenden. Es funktioniert jedoch nicht auf einem echten iPhone.

Dies liegt daran, dass ein echtes iPhone eine Bibliothek benötigt, die für die ARM -Architektur und gegen das echte iPhoneos SDK erstellt wurde.

(Es gibt eine Nebenausgabe von Gebäuden 3 separate Bibliotheken - i386, ARM6 und ARM7 und kombiniert alle 3 in 'Fat' Library, die in jeder Umgebung verwendet werden kann. Ich muss in der Lage sein, für Arm zu bauen, bevor ich zukomme dieses Problem).

** Schließlich meine Frage !! **

Der letzte Schritt besteht darin, die Zeromq-Bibliothek zu dem Arm zu bauen. Ich habe den ganzen Tag versucht, dafür die richtigen Schalter zu finden, und habe alle Beispiele im Internet untersucht, die ich finden kann, aber keine scheint eine Lösung zu haben, die funktioniert.

Das nächste, was ich arbeiten muss, ist:

./configure CXX=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2
CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
LD=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld CFLAGS="-O -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk"
CXXFLAGS="-O -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk"
--disable-dependency-tracking --host=arm-apple-darwin10
LDFLAGS="-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk" 
AR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar 
AS=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/as 
LIBTOOL=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/libtool 
STRIP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/strip 
RANLIB=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ranlib

Dies erzeugt eine Konfiguration, die make Kompiliert den Nulomq -Code, fällt jedoch mit vielen Verbindungsfehlern fehl, z. B.:

ar: libzmq_la-clock.o: No such file or directory

Ich habe viele andere Konfigurationen ausprobiert, aber sie passieren nicht einmal ./configure korrekt.

Kann mir jemand mit einem geeigneten helfen ./configure Parameterliste zur Erstellung einer ARM -Architekturstatikbibliothek? Dies ist alles, was ich brauche, um Nulomq auf einem echten iPhone zu arbeiten.

Und und alles hilft sehr geschätzt!

War es hilfreich?

Lösung

Ich dachte nur, ich würde teilen, dass ich die Antwort am Ende gefunden habe - der Trick war hinzuzufügen CPP="cpp" CXXCPP="cpp" zum ./configure Aussage, geben:

./configure CPP="cpp" CXXCPP="cpp" CXX=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2 CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 LD=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld CFLAGS="-O -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk" CXXFLAGS="-O -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk" --disable-dependency-tracking --host=arm-apple-darwin10 LDFLAGS="-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk" AR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar AS=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/as LIBTOOL=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/libtool STRIP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/strip RANLIB=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ranlib

Ich habe diese Konfiguration verwendet, um Neromq für ARM erfolgreich zu erstellen, wie in meiner neuen iPhone -App, die ich zuerst summte (erhältlich bei http://itunes.apple.com/gb/app/i-buzzed-first!/id490622820?mt=8 )

Andere Tipps

Diese Frage hängt nicht wirklich mit Monotouch zusammen, sondern wie man 0mq auf dem iOS (Arm) zusammenstellt. Schauen Sie sich an: Kompilieren Sie C lib für das iPhone

Hoffentlich wird es Ihnen helfen und auch die nächste Frage abdecken: Fette universelle Binärdateien mit Verwendung lipo. Die gute Nachricht ist, dass Sie, wenn dies auf dem Simulator funktioniert, wahrscheinlich bereits ein Monotouch-Problem behandelt :-)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top