J'essaie d'utiliser la bibliothèque ZeroMQ dans une application iPhone développée en C# à l'aide de MonoTouch. J'ai résolu presque tous les problèmes, mais je suis tombé au dernier obstacle. J'utilise ZeroMQ 2.1.10 et la liaison/encapsuleur C# CLR, et je développe sous Mac OS X 10.6.8. Voici l'histoire à ce jour:La compilation croisée ZeroMQ vers ARM pour une application iPhone MonoTouch configure les paramètres
J'ai d'abord essayé d'utiliser ZeroMq dans une application de Console Mono C# simple. J'ai construit ZeroMQ avec ./configure
, puis make
et sudo make install
, qui installe la bibliothèque partagée /usr/local/lib/libzmq.dylib
. La liaison ZeroMq C# clrzmq.dll
est un wrapper qui utilise la fonctionnalité 'core' ZeroMq via les appels C Api [DllImport]
.
L'application de test n'a pas fonctionné, ce que j'ai compris que la norme ZeroMQ ./configure
produit une sortie 64 bits, et Mono est seulement 32 bits. J'ai ensuite reconstruit ZeroMQ avec
./configure CFLAGS="-O -arch i386" CXXFLAGS="-O -arch i386" LDFLAGS="-arch i386" --disable-dependency-tracking
Ma simple application C# ZeroMq a ensuite fonctionné correctement.
En continuant, j'ai ensuite essayé d'utiliser ZeroMq à partir d'une application iPhone dans le simulateur iPhone. J'ai découvert que l'iPhone ne permet que des bibliothèques liées statiquement (aucune bibliothèque dynamique autorisée). Ceci est réalisé en changeant tous les appels wrapper C# pour
[DllImport("__Internal", CallingConvention = CallingConvention.Cdecl)]
et dont libzmq.a
directement dans le projet MonoTouch et modifier les arguments de mTouch supplémentaires
-cxx -gcc_flags "-L${ProjectDir} -lzmq -force_load ${ProjectDir}/libzmq.a"
pour assurer la bibliothèque ZeroMQ est incluse dans l'application iPhone . Lors de l'exécution de l'application dans le simulateur de l'iPhone, il s'est écrasé, que j'ai retracé à un appel effectué à partir d'un zmq_init()
à socketpair
. J'ai finalement tracé cela à la bibliothèque ZeroMQ ayant été construite contre les en-têtes et bibliothèques MacOS de ma machine de construction, plutôt que contre le SDK de l'iPhone. Cela a été corrigé par
./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
Succès dans le simulateur iPhone! Le simulateur nécessite des bibliothèques statiques i386 construites sur le simulateur d'iPhone SDK. Je peux maintenant utiliser la fonctionnalité ZeroMQ dans une application iPhone dans le simulateur SEULEMENT. Cela ne marche cependant pas sur un vrai iPhone. C'est parce qu'un vrai iPhone nécessite une bibliothèque qui a été construite pour l'architecture ARM, et contre le vrai SDK iPhoneOS.
(Il y a un problème de construction de 3 bibliothèques séparées - i386, ARM6 et ARM7, et en combinant les 3 dans la bibliothèque 'fat' qui peut être utilisée dans n'importe quel environnement. avant que j'arrive à ce problème).
** Enfin, ma question !! **
La dernière étape consiste à compiler de manière croisée la bibliothèque ZeroMQ en ARM. J'ai essayé toute la journée de trouver les bons commutateurs pour cela, et j'ai étudié tous les exemples sur Internet que je peux trouver, mais aucun ne semble avoir une solution qui fonctionne.
Le plus proche que j'ai à travailler est:
./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
Cela produit une config qui make
compile le code ZeroMQ, mais échoue avec beaucoup d'erreurs de lien, par exemple:
ar: libzmq_la-clock.o: No such file or directory
Je J'ai essayé de nombreuses autres configurations, mais elles ne passent même pas ./configure
correctement.
Quelqu'un peut-il m'aider avec une liste de paramètres ./configure
appropriée pour produire une bibliothèque statique d'architecture ARM? C'est tout ce dont j'ai besoin pour que ZeroMQ fonctionne sur un vrai iPhone.
Et et tous aident beaucoup apprécié!
je l'avais déjà regardé la Compile C lib pour la page iPhone, mais dans ce post, le script configure de l'affiche originale ne fonctionne pas pour lui r moi, et ce post a terminé avec «je l'ai réparé avec l'aide de ce poste» et quelques liens brisés. Je ne peux toujours pas obtenir une compilation croisée avec ARM de ZeroMQ en ce moment. Je vais continuer à essayer! – yorkshirespud