2009-09-20 10 views
4

Je crée une bibliothèque statique à utiliser dans les applications iPhone. Il contient un certain nombre de fichiers source qui n'exportent aucun symbole, tout ce qu'ils font est d'instancier une instance statique d'une classe qui exécute ensuite du code dans son constructeur qui enregistre diverses choses avec une classe de gestionnaire central ailleurs. Tout fonctionne correctement lorsque le code est construit dans le cadre d'une application iPhone standard, mais quand il est séparé en une bibliothèque statique, ces fichiers ne le font pas dans le binaire final de l'application et donc les constructeurs pour les instances privées qu'ils contiennent. ne pas courir, et cela provoque des problèmes. J'ai désactivé toutes les options de construction à faire avec décapage mort et ainsi de suite pour la construction de la bibliothèque statique et la construction de l'application finale.Forcer l'inclusion de fichiers d'objets de bibliothèque statiques qui n'exportent aucun symbole (GCC/iPhone)

Je me suis heurté à ce problème sur le compilateur Metrowerks il y a quelques temps, mais dans ce cas, il se produisait même lorsque le code était intégré dans une seule application sans bibliothèques intermédiaires. La solution était assez simple: il suffit d'utiliser __declspec(force_export) sur les instances de classe privées et tout va bien.

Existe-t-il un équivalent pour GCC/iPhone? J'utilise Xcode 3.1.4 avec GCC 4.2 et cible iPhone OS 3.1. Alternativement, existe-t-il un moyen de dire à l'application de lier dans chaque fichier objet de la bibliothèque statique, qu'elle soit explicitement référencée ou non? J'ai confirmé à l'aide de ar que l'ensemble complet des fichiers objets le fait dans la bibliothèque statique.

Merci d'avance.

Répondre

5

Je pense que l'option que vous recherchez est -all_load:

-all_load 
     Loads all members of static archive libraries. See man ld(1) for 
     more information. 
+0

Fantastique! Cela a fait exactement ce qui était nécessaire :-). –

3

-all_load a quelques problèmes si vous arrivez à relier de nombreuses bibliothèques et/ou des cadres (Mac OS X). Dans ce cas, vous devez forcer tous les symboles d'une bibliothèque spécifique en utilisant -force_load:

g++ test.cpp -o test -force_load libtoload.a 
+0

Hmmm ... après quelques tests, il semble que "force_load" ne fonctionne pas pour moi (Mac OS 10.6.2). Mais "all_load" a finalement fonctionné correctement avec les frameworks. – gaspard