2011-02-07 2 views
11

J'ai une application qui comprend une bibliothèque externe j'ai développé, et je reçois le message d'avertissement suivant à chaque fois que je compile en utilisant l'appareil comme cible:Comment se débarrasser de l'avertissement "fichier a été construit pour le format de fichier non pris en charge" lors de la liaison avec une bibliothèque statique?

mylib-release-iphonesimulator.a, fichier a été construit pour le format de fichier non pris en charge qui n'est pas l'architecture étant lié (armv7).

J'ai deux versions de la bibliothèque, toutes deux ajoutées au projet. Un construit pour l'iphonesimulator et l'autre pour iphoneos.

Même si cela fonctionne bien sur n'importe quelle cible (il semble que le compilateur prenne la bonne version de la bibliothèque en fonction de la cible) ce type d'avertissement devient anoying.

Est-il possible de se débarrasser de l'avertissement, ou mieux encore de compiler les deux plates-formes sur une même bibliothèque en évitant d'avoir deux binaires de la même bibliothèque?

Merci!

Répondre

30

Vous ne voulez pas obtenir débarrasser de cette erreur, vous voulez fixer il.

Le problème ici est que vous liez un simulateur version de votre bibliothèque dans l'appareil build de votre application. Le simulateur veut des bibliothèques dans l'architecture i386, et l'appareil veut des choses dans l'architecture armv6 ou armv7.

Donc la solution ici est de lier la bonne version de votre bibliothèque.

Ce que je fais habituellement est de les combiner dans une seule bibliothèque et de laisser l'éditeur de liens choisir la bonne version pour moi. Voici ce que vous faites dans le Terminal:

$ cd /path/to/my/libraries 
$ ls 
    libMyLibrary-Device.a 
    libMyLibrary-Simulator.a 
$ file libMyLibrary-Device.a 
    libMyLibrary-Device.a: Mach-O universal binary with 2 architectures 
    libMyLibrary-Device.a (for architecture armv6): current ar archive random library 
    libMyLibrary-Device.a (for architecture armv7): current ar archive random library 
$ file libMyLibrary-Simulator.a 
    libMyLibrary-Simulator.a: Mach-O universal binary with 1 architecture 
    libMyLibrary-Simulator.a (for architecture i386): current ar archive random library 
$ lipo -create -output libMyLibrary.a libMyLibrary-Device.a libMyLibrary-Simulator.a 
$ ls 
    libMyLibrary-Device.a 
    libMyLibrary-Simulator.a 
    libMyLibrary.a 
$ file libMyLibrary.a 
    libMyLibrary.a: Mach-O universal binary with 3 architectures 
    libMyLibrary.a (for architecture armv6): current ar archive random library 
    libMyLibrary.a (for architecture armv7): current ar archive random library 
    libMyLibrary.a (for architecture i386): current ar archive random library 

Ensuite, vous lien juste libMyLibrary au lieu de la version de l'appareil ou d'un simulateur, et l'éditeur de liens faire la bonne chose.

+0

C'est exactement ce que je cherchais. Merci beaucoup! –

+0

Merci. Lorsque vous construisez pour iphone simulator Dans quel emplacement se trouve la bibliothèque statique? – huggie

0

Si vous ne voulez pas combiner les bibliothèques pour une raison quelconque (comme avoir une librairie de débogage et une librairie de libération), vous pouvez inclure différentes bibliothèques en fonction de votre cible de génération. Si vous ouvrez les informations sur votre projet (cliquez avec le bouton droit de la souris sur le projet-> Lire les informations ou surlignez-le et cliquez sur le bouton Info) et descendez dans la section Liaison, sélectionnez Autres indicateurs, puis cliquez sur En bas à gauche de l'écran, l'une des options est Ajouter une condition de réglage de construction. En cliquant sur cette option, vous obtiendrez une option enfant sous Autres indicateurs de lieur qui a, par défaut, toutes les listes déroulantes SDK et Toutes les architectures avec une ligne vide suivante. De là, vous pouvez définir des indicateurs de liens spécifiques (-lmylib-release-iphonesimulator etc.) en fonction des différents paramètres de construction.

5

J'avais le même problème avec la bibliothèque SQLite 3 (libsqlite3.dylib). J'ai ouvert un projet plus ancien et la même bibliothèque compilée. J'ai comparé les informations sur les cibles> les paramètres de construction> les chemins de recherche de chaque projet et, alors que le projet précédent était vide, il y avait plusieurs chemins de recherche dans les «chemins de recherche du cadre» du nouveau projet. La suppression de tous a résolu le problème. J'espère que cela aidera quelqu'un, cela m'a pris beaucoup, beaucoup d'heures pour comprendre.

+0

Regardé partout pour cela ... continué à supprimer et à ajouter le cadre iphoneos. Mais ces chemins étaient à la recherche de la structure du simulateur. Merci beaucoup! –

Questions connexes