2010-07-28 8 views
25

Je suis confronté à la double bind, que d'une part l'une des bibliothèques statiques tierces, mon application iPhone utilise, l'éditeur de liens -all_load doit être défini dans le projet d'application ou les paramètres cible, sinon l'application se bloque à l'exécution ne trouvant pas certains symboles, appelés en interne à partir de la lib, d'autre part pour une autre partie statique lib -all_load ne doit pas être définie au niveau de l'application, ou l'application ne se construira pas grâce à une erreur de "lien en double". Pour résoudre ce problème, je veux maintenant utiliser force_load instant de load_all, car en raison de la documentation, il fait la même chose que all_load, mais seulement pour le chemin passé ou lib-file, au lieu de toutes les libs. Le problème avec force_load est, je n'ai pas la moindre idée, comment passer un chemin ou un fichier en paramètre avec lui, lors de son passage via xcode project- ou target-settings. Toutes les possibilités de syntaxe qui me viennent à l'esprit amènent xcode à penser son autre drapeau de liaison au lieu d'un paramètre au précédent, ou le linker envoie des erreurs de syntaxe ou le drapeau ne fait rien du tout par rapport à ne pas être défini. J'ai également ouvert le fichier .pbxproj dans un éditeur de texte pour l'éditer manuellement, mais lors du rechargement du projet avec xcode, il change automatiquement la syntaxe en interprétant le paramètre à force_load comme un indicateur séparé.xcode projet-/target-settings-syntaxe pour linker flag force_load sur iPhone

Toute personne ayant une idée sur ce problème?

Thx, Kaiserludi.

+0

bounty pour tous ceux qui peuvent montrer comment faire fonctionner force_load. Fondamentalement, certaines des bibliothèques de mon projet doivent être liées à all_load; d'autres doivent être liés sans cela. –

Répondre

18

Je viens d'essayer ça. J'ai compilé un binaire gras armv6, armv7 et i386 de PCRE pour l'utiliser dans mon projet iPhone. Mon projet a normalement juste ma bibliothèque ajoutée au projet et que les liens bien. J'ai donc décoché la case d'adhésion cible pour libpcre.a et reconstruit. Comme prévu, je reçois un tas d'erreurs de liens de symboles manquants pour les symboles pcre. J'ai ensuite ouvert la fenêtre des paramètres de la cible et édité la section "Autres indicateurs de liens". J'ai ajouté:

-force_load lib/pcre/libpcre.a 

Le répertoire lib est dans le même répertoire que mon fichier project.xcodeproj.

Il est bien lié donc je sais que la commande force_load a fonctionné (et je peux la voir ajoutée aux drapeaux de construction quand xcode construit le fichier).

Espérons que ça aide.

Mise à jour:

J'ai aussi essayé d'ajouter une bibliothèque de système à la ligne "Autres drapeaux Linker" comme ceci:

-force_load src/pcre/libpcre.a -force_load ${SDKROOT}/usr/lib/libz.dylib 

Cela a fonctionné aussi.

+1

Hmmmm, j'ai une bibliothèque avec des catégories.Si je le lie avec all_load, tout va bien. Si je le lie sans all_load, il lie OK, mais à l'exécution il a des erreurs quand il essaie d'appeler des méthodes de catégorie. Si je le lier avec force_load directoryPath/release-iOS-interne-iphonesimulator/libraryname.a, j'obtiens une erreur de symbole en double. La version que je construis est la version de débogage; cela pourrait-il avoir quelque chose à voir avec ça? –

+1

La commande force_load inclut votre bibliothèque. Si vous avez une erreur de symbole en double, alors vous avez probablement un symbole en double quelque part. Je ne suis pas sûr si cela causerait un problème mais la bibliothèque est-elle incluse en tant que membre de votre projet et aussi via force_load? Peut-être que cela fait une différence avec les catégories. Avez-vous une méthode de catégorie avec le même nom déjà définie dans votre projet quelque part? Vous pouvez aussi regarder la fenêtre des résultats de construction dans xcode, sélectionner 'montrer tous les messages', puis dérouler la commande link pour obtenir la ligne de commande, puis aller jouer avec celle-ci dans le terminal. – par

+0

Selon http://wiki.phonegap.com/w/page/Upgrade-your-PhoneGap-Xcode-Template-for-3rd-Party-Library-Linkage-Problems, il semble que vous utilisiez le drapeau correctement . Ma conjecture serait aussi que vous avez une classe ou une catégorie avec le même nom qu'un dans la bibliothèque que vous liez ... –

1

Je viens d'ajouter force_load à notre projet et tout va bien en utilisant la syntaxe la plus simple possible. La bibliothèque est une dépendance construite dans le même projet. La bibliothèque est donc incluse deux fois sur la ligne de commande du lien: une fois en tant que fichier d'entrée normal et une fois en tant qu'argument de -force_load. Vous pourriez vouloir mettre des caractères de citation autour de l'argument.

En fait, j'ai même eu ce travail en utilisant des paramètres dépendant de la configuration (parce que le chemin est évidemment différent pour le débogage par rapport à la version et le périphérique par rapport au simulateur).

Bonne chance.

+0

En fait, la raison , que force_load ne fonctionnait pas pour moi, était, que j'ai ajouté des citations. Supprimer les guillemets conduit à Xcode en le divisant en deux lignes, mais le fait fonctionner, lorsqu'il est passé de l'EDI au compilateur. Avec des guillemets, il est correctement affiché dans l'EDI, mais le compilateur ne peut pas le gérer de cette façon. – Kaiserludi