2010-08-31 27 views
4

Je suis en train de compiler ZeroMQ C de liaison afin de pouvoir l'utiliser sur iPhone, voici mes options de configuration:Compile C lib pour iPhone

./configure --host=arm-apple-darwin --enable-static=yes --enable-shared=no CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-gcc-4.2.1 CFLAGS="-pipe -std=c99 -Wno-trigraphs -fpascal-strings -O0 -Wreturn-type -Wunused-variable -fmessage-length=0 -fvisibility=hidden -miphoneos-version-min=3.1.2 -gdwarf-2 -mthumb -I/Library/iPhone/include -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.0.sdk -mdynamic-no-pic" CPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp 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

Il configure en fait et compile très bien, mais quand je l'ajoute à la section Xcode Frameworks, j'obtiens un avertissement: ld: warning: in /path/to/app/libzmq.a, file was built for unsupported file format which is not the architecture being linked (armv7) et beaucoup d'erreurs de symbole non trouvées.

Si je change l'architecture active actuelle de armv6 à armv7, un message d'avertissement le transformera en armv6. Qu'est-ce que je fais de mal?

Merci, Dan

Répondre

6

On dirait que vous construisez un binaire universel ARMv6/ARMv7 pour l'iPhone (ce qui est la valeur par défaut, ce qui est logique). Cela signifie que vous devez créer une bibliothèque universelle à lier. Générez à la fois bibliothèques, puis utilisez lipo pour combiner les deux. Par exemple, construisez l'armv6 et placez-le à armv6/libfoo.a, et l'armv7 à armv7/libfoo.a. Ensuite, exécutez

lipo -arch armv6 armv6/libfoo.a -arch armv7 armv7/libfoo.a -output libfoo.a -create 

pour créer la bibliothèque universelle libfoo.a.

+0

Merci pour la réponse, mais comment définir l'architecture? arm-apple-darwin10-gcc-4.2.1 ne comprend pas l'option -arch. Btw, lipo -info pour ma lib dit que compilé pour x86_64, ce qui est étrange. – Dan

+0

Désolé, je n'ai pas remarqué que vous ne passiez pas l'option '-arch'. Je ne suis pas sûr pourquoi il ne l'accepte pas, mais pourquoi ne pas utiliser '/ Developer/Platforms /.../ gcc' à la place? Je viens de chercher mes commandes de configuration pour les bibliothèques C que j'ai utilisées, et souvent cela fonctionne. –

+2

Merci, j'ai finalement été en mesure de le compiler correctement en utilisant le script de cette question - http://stackoverflow.com/questions/1602182/cross-compile-autotools-based-libraries-for-official-iphone-sdk – Dan

0

Compte tenu du message d'avertissement ld, je suppose que vous ne sont pas est la compilation de la bibliothèque pour la plate-forme correcte. Et étant donné que vous utilisez configure, je suppose que vous essayez de compiler la bibliothèque en dehors de Xcode et de l'insérer dans Xcode ultérieurement pour la lier.

Vous pourriez peut-être essayer d'exécuter configure pour configurer vos en-têtes, mais est-ce que la compilation proprement dite marche dans Xcode?

Il y a beaucoup de questions connexes ici sur SO concernant la compilation de bibliothèques tierces (externes) C ou C++ à utiliser dans les projets iPhone.

Creating static library for iPhone

TiMidity: need help compiling this library for the iPhone

+0

Actuellement, le meilleur guide que j'ai trouvé pour compiler des bibliothèques pour plusieurs architectures est le suivant: http://tinsuke.wordpress.com/2011/02/17/how-to-cross-compiling-libraries-for-ios-armv6armv7i386/ – Alper