[Résolu] Probleme template BSD Static Library
Sev3n
Membre
Bonjour,
J'ai un petit problème concernant les libraires statiques avec Xcode. J'ai essayé de créer un projet command-line tout simple (en C) pour voir comment gérer les lib static sous xcode. Donc j'ai juste créer 3 fichiers le main.c, util.h, util.c (util est ma lib).
Mon main.c
util.h
util.c
J'ai donc dans mon projet 2 targets, une pour créer l'exe et l'autre pour la lib statique qui suit le template BSD Static Library. J'ai ajouté des dépendances dans la target de l'exe et ajoute la libutil.a dans la build phase Link Binary With Library. Mais lorsque j'essaie de build l'exe le linker n'arrive pas à trouver le symbole et affiche une erreur :
En revanche lorsque je teste via une lib shared tout fonctionne correctement. Le plus curieux c'est que lorsque j'utilise le template BSD Static library juste après (j'ai clean la build dir avant) je n'ai plus d'erreur et cela fonctionne.
J'ai aussi essayer de le faire manuellement en ligne de commande
J'ai toujours la même erreur alors que sous Solaris, par exemple, ça fonctionne.
Etant novice sous mac, je voudrais comprendre pourquoi ça ne marche et savoir s'il y a des options de configurations dont j'ignore l'existence pour résoudre ce problème.
Merci.
(Je suis sous Xcode 3.2.1)
J'ai un petit problème concernant les libraires statiques avec Xcode. J'ai essayé de créer un projet command-line tout simple (en C) pour voir comment gérer les lib static sous xcode. Donc j'ai juste créer 3 fichiers le main.c, util.h, util.c (util est ma lib).
Mon main.c
<br />#include "util.h"<br /><br />int main (int argc, const char * argv[]) {<br /> printSomething(); // dans la lib<br /> return 0;<br />}<br />
util.h
<br />#ifndef H_UTIL_H<br />#define H_UTIL_H<br /><br />extern void printSomething(void);<br /><br />#endif<br />
util.c
<br />#include <stdio.h><br /><br />void printSomething(void) {<br /> printf("hello world\n");<br />}<br />
J'ai donc dans mon projet 2 targets, une pour créer l'exe et l'autre pour la lib statique qui suit le template BSD Static Library. J'ai ajouté des dépendances dans la target de l'exe et ajoute la libutil.a dans la build phase Link Binary With Library. Mais lorsque j'essaie de build l'exe le linker n'arrive pas à trouver le symbole et affiche une erreur :
<br />Undefined symbols:<br /> "_printSomething", referenced from:<br /> _main in ccu5JEeP.o<br />ld: symbol(s) not found<br />collect2: ld returned 1 exit status<br />
En revanche lorsque je teste via une lib shared tout fonctionne correctement. Le plus curieux c'est que lorsque j'utilise le template BSD Static library juste après (j'ai clean la build dir avant) je n'ai plus d'erreur et cela fonctionne.
J'ai aussi essayer de le faire manuellement en ligne de commande
<br />gcc -c util.c -o util.c<br />ar rs libutil.a util.o<br />gcc main.c -o main -L. -lutil<br />
J'ai toujours la même erreur alors que sous Solaris, par exemple, ça fonctionne.
Etant novice sous mac, je voudrais comprendre pourquoi ça ne marche et savoir s'il y a des options de configurations dont j'ignore l'existence pour résoudre ce problème.
Merci.
(Je suis sous Xcode 3.2.1)
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Pourquoi mets-tu extern sur le prototype de printSomething( ) ?
et en ajoutant la mise à jour de la table de ta librairie ?
gcc -c util.c -o util.c
ar rs libutil.a util.o
ranlib libutil.a
gcc main.c -o main -L. -lutil
Voir la page man de Libtool et ranlib ...
Concernant la première partie avec l'image du projet Xcode, j'avais exactement la même chose à part que le main.c n'était pas dans les Compiled Sources de la target de la lib. Chez moi ça marche toujours pas. Eventuellement pourrais-tu joindre ton archive du projet pour que je teste ?
Concernant ton second post,
D'après ce que j'avais lu dans le man de ar, ar -s est équivalent à faire un ranlib sur la lib donc ça ne change rien dans mon cas (j'ai quand même essayé de le faire explicitement histoire d'être sur).
Par exemple, si je lance un otool -Sv libutil.a j'obtiens le résultat suivant :
Comme je suis loin d'être un expert, j'ai un peu du mal à comprendre pourquoi le linker ne trouve pas le symbole. En revanche, si je passe la lib sans le -l ça compile normalement.
Oui, le main.c n'a aucune raison d'être là .
Je viens de comprendre mon erreur (et j'ai l'air d'un gros noob now :S).
En fait le problème venait du nommage de ma lib. Comme le linker regarde d'abord les répertoires standards avant le -L et cherche d'abord les .dylib avant les .a il se trouve qu'il y a une lib qui s'appelle libutil.dylib dans /usr/lib ce qui s'explique pourquoi il ne trouvait pas le symbole.
La prochaine fois, je choisirai des noms un peu moins courant, çà m'évitera ce genre de déconvenue.
Merci encore phil.
Oui, j'aurais du penser aussi à cette librairie
A l'occasion, la lecture de la page man libtool apprend que ar est en vue d'être "deprecated" sur mac os.
Le build result (menu Build > Build Result après avoir fait un Build > Clean All Targets) de la librairie donne la commande de référence suivante