2009-11-15 6 views
7

Mon client me fournit deux bibliothèques précompilées, blah-device.a et blah-simulator.a. Comment puis-je dire à xcode d'utiliser blah-device.a en mode de compilation Device et de simuler en mode de compilation Simulator?Comment lier différentes bibliothèques précompilées pour différents profils de construction dans XCode pour iPhone?

Mon client me donne ces instructions

  1. Ouvrez le groupe Cibles (dans les groupes & panneau Fichiers), cliquez droit sur l'icône du projet , puis sélectionnez Ajouter> Cadres existants.
  2. Dans la section Bibliothèques Linked, cliquez sur l'icône Ajouter Bibliothèques (+), puis cliquez sur Ajouter Autre.
  3. Sélectionnez soit bla-dispositif.Procédé (pour le développement directement sur l'appareil iPhone ) ou bla-simulator.a (pour le développement sur le simulateur iPhone), puis cliquez sur Ajouter.

Je l'ai déjà copié le fichier d'en-tête là-bas, mais ces instructions ne font pas la construction facile avec des profils différents.

Comment puis-je Xcode pour relier bla-dispositif.Procédé lors de la construction avec les profils de périphériques et bla-simulator.a lors de la construction avec les profils SIMULATEUR?

Toute aide est grandement appréciée.

Répondre

5

Il existe un moyen plus simple de le faire. Vous pouvez dupliquer les "chemins de recherche de bibliothèque" sous une cible et définir une architecture différente pour chacun d'entre eux. Vous pouvez ensuite définir un chemin différent pour le simulateur et les périphériques.

1

La façon la plus simple serait de créer deux cibles distinctes en dupliquant votre existant. Nommez un "Foo Device" et l'autre "Foo Simulator". Ensuite, faites un clic droit sur le blah-device.a dans XCode, sélectionnez l'onglet Targets et assurez-vous que la cible "Foo Device" est activée et que la cible "Foo Simulator" est désactivée.

Répétez l'opération pour balah-simulator.a mais cette fois-cible "Foo Device" est OFF et la cible "Foo Simulator" est cochée ON.

Maintenant, chaque fois que vous voulez faire une version de simulateur assurez-vous que vous sélectionnez le simulateur dans le menu contextuel Active SDK et le « Foo Simulator » dans le menu contextuel cible. Pour le test du périphérique, sélectionnez Device AND la cible "Foo Device".

+0

Merci! De toute façon pour accomplir ceci sans une autre cible et juste en utilisant les paramètres de construction des profils XCode? – CVertex

+0

Le problème est que blah-device.a et blah-simulator.a exportent les mêmes symboles. Un moyen de contourner cela est de tester en fonction de #if TARGET_IPHONE_SIMULATOR ... dans l'en-tête et de définir Foo comme une macro de préprocesseur pour FooDevice vs FooSimulator. Ensuite, vous pouvez inclure les deux bibliothèques et le bon symbole est lié. Mais si les deux bibliothèques contiennent les mêmes symboles de liens, vous obtiendrez des erreurs de symboles en double. Dans ce cas, le seul moyen est d'exclure l'un d'un lien dans une situation par rapport à l'autre. Vous pouvez jouer avec les valeurs du chemin de l'éditeur de liens, mais il est beaucoup plus facile d'utiliser plusieurs cibles. – Ramin

14

Pour référence ultérieure, une bonne façon de gérer des situations comme celle-ci est à glob les différentes architectures .a de en une seule que vous pouvez inclure dans XCode. Vous pouvez le faire avec l'outil de ligne de commande lipo:

lipo libx.a liby.a -create -output libz.a

Si libx.a est ARMv6 et ARMv7 et liby.a est pour i386 Par exemple, la bibliothèque résultante, libz.a, sera armv6, armv7 et i386.

Vous pouvez également inspecter un fichier .a via lipo -info.

Espérons que cela aide.:)

2

vous pouvez utiliser différents de chemin de liaison pour les différentes bibliothèques linking path's

+0

C'est un bon conseil, merci! – natevw

Questions connexes