2011-11-29 6 views
4

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é!

+0

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

Répondre

5

Je pensais juste que je partagerai que j'ai trouvé la réponse à la fin - l'astuce était d'ajouter CPP="cpp" CXXCPP="cpp" la déclaration ./configure, donnant:

./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 

J'ai utilisé cette configuration pour construire avec succès ZeroMQ pour ARM, tel qu'il est utilisé dans ma nouvelle application iPhone je bourdonnaient d'abord (disponible à http://itunes.apple.com/gb/app/i-buzzed-first!/id490622820?mt=8)

+1

Il y a un autre point à ajouter ci-dessus. Les tests ont révélé que la version ci-dessus a produit une bibliothèque qui fonctionnait bien dans iOS 4 et 5, mais qui s'est écrasée sur iOS3. Voir [link] (http://iphone.galloway.me.uk/2010/05/iphone-sdk-bug-hunting-gcc-atomic-builtins/) pour plus d'informations, mais la version courte est celle lors de la construction pour l'utilisation le SDK iOS5 et g ++ 4.2 ou supérieur, le compilateur utilise des opérations non prises en charge dans iOS3. La solution consiste à modifier '/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/include/C++/4.2.1/bits/C++ config.h' et à supprimer' #define _GLIBCXX_ATOMIC_BUILTINS 1' pour construire – yorkshirespud

+1

Bien fait YorkShirePud! – BonanzaDriver

2

Cette question n'est pas vraiment liée à MonoTouch mais à la façon de compiler 0MQ sur iOS (ARM). Jetez un oeil à: Compile C lib for iPhone

J'espère que cela va vous aider et aussi de couvrir la question suivante: binaires universels gras en utilisant lipo. Les bonnes nouvelles sont que, si cela fonctionne sur le simulateur, alors vous avez probablement déjà couvert tous les problèmes liés MonoTouch :-)

Questions connexes