2010-07-28 7 views
14

Cela peut être une question très stupide, mais je suis nouveau à développer sur Mac et j'ai du mal avec les binaires universels.Comment compiler des librairies universelles sous Mac OS X?

J'ai une application que je compile dans QT Creator, qui selon lipo produit des sorties d'architecture i386. Si je comprends bien, cela signifie qu'il produit des sorties Mac OS X 32 bits.

L'application dépend de deux bibliothèques externes. Une de ces bibliothèques que je compile en appelant ./config en premier, puis make. ./config indique qu'il est "configuré pour darwin-i386-cc". Cependant, après l'exécution de make et l'appel de lipo sur le résultat, l'architecture est signalée comme x86_64.

De même, j'ai une autre bibliothèque externe. Celui-là n'a pas de script configure, et je le compile simplement en appelant make. La sortie de celui-ci est aussi x86_64. Comment puis-je compiler ces deux bibliothèques externes afin qu'elles produisent quelque chose de compatible avec la sortie i386 de mon application? Mieux encore, comment puis-je compiler ces deux bibliothèques externes pour produire des bibliothèques universelles afin que je puisse produire un binaire universel à partir de mon application qui fonctionne à la fois sur 32 et 64 bits? En outre, compte tenu de l'état actuel du monde Mac, y a-t-il d'autres plateformes que je devrais cibler pour créer un binaire universel Mac OS X approprié et convivial?

Répondre

13

Finalement, ça a marché. Pour contrôler l'architecture de la cible, je suis entré manuellement et j'ai édité les Makefiles.

Pour l'un d'entre eux, j'ai ajouté à la fin de la ligne qui commence par CFLAGS: -arch i386 -arch x86_64 -arch ppc Cela a produit un binaire universel.

Pour l'autre, quand je faisais la même chose, la compilation ferait une erreur. J'ai dû faire un cycle et ne mettre qu'une seule arche à la fois, et puis après avoir produit les trois, j'ai appelé le lipo avec le drapeau -create pour créer un binaire universel.

+0

savez-vous si cela fonctionne également pour l'ajout de support iOS – tofutim

+0

ahd quelle est cette bibliothèque universelle, est-ce juste toutes les différentes compilations écrasées ensemble? finiriez-vous avec une énorme bibliothèque alors? – tofutim

1

Je ne peux pas répondre à la partie principale de votre question, parce que j'utilise toujours Xcode plutôt que de faire. Mais pour ce qui est de cette dernière partie, si vous supportez les versions d'OS antérieures à 10.6, vous devrez peut-être également compiler PowerPC (archi code "ppc").

+0

Est-ce que PowerPC construit quelque chose qu'une partie importante du marché de consommation de Mac attend encore? Donc, un total de 3 plates-formes sont attendues pour les binaires universels? – Nantucket

+1

Je ne sais pas quel est le pourcentage, mais je supporte toujours PowerPC, et je pense que beaucoup d'autres produits le font. Et je ne supporte pas encore les 64 bits, car mon produit est en partie Carbone. Mais si vous développez un nouveau produit maintenant, il ne serait pas déraisonnable d'utiliser uniquement Intel. Pensez à votre marché: certains segments, comme l'éducation, peuvent s'accrocher à du vieux matériel plus longtemps que d'autres. – JWWalker

+1

Encore une chose: pour autant que je sache, le terme «binaire universel» signifie habituellement i386 + ppc, pas i386 + x86_64. – JWWalker

7

pour ./configure, vous pouvez utiliser ceci:

./configure CFLAGS = "- arc i386 de x86_64" CXXFLAGS = "- les de x86_64 de i386 arc" LDFLAGS = "- arc i386 de la x86_64 "--disable-dependency-tracking

--disable-dependency-tracking est important ou gcc/g ++ refusera de compiler du code.