Question

J'ai deux fichiers -> fact.h et main.c dans le /home/snyp1/new dossier. main.c la fonction principale qui appelle à la fact(int x) fonction dans fact.h.Je suis entrain de créer un .a archive avec l'ar de commande ->

snyp1@Snyp:~/new$ ar -r -s libfact.a fact.o
ar: creating libfact.a
fact.h  fact.o  libfact.a  main.c
snyp1@Snyp:~/new$ gcc main.c -L/home/snyp1/new -lfact -o main
/home/snyp1/new/libfact.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status
snyp1@Snyp:~/new$ ranlib libfact.a
snyp1@Snyp:~/new$ gcc main.c -L/home/snyp1/new -lfact -o main
/home/snyp1/new/libfact.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status

Je suis sur ubuntu 12.04.S'il vous plaît laissez-moi savoir ce qui est mal.(Aussi, si je n'utilise pas le -L/.../new, gcc va dire qu'il ne peut pas trouver "lfact", c'est peut-être parce qu'elle n'est pas dans /usr/local/lib)

EDIT:OK j'ai trouvé la cause.Son dû au fait que j'ai été en utilisant fact.h pour construire le fact.o et puis à la mettre dans la bibliothèque, il ne fonctionnait pas comme prévu.Donc j'ai maintenant changé en file.c et fonctionne bien maintenant.Je devrais avoir fourni cette information, je suis désolé.Si je ne sais pas pourquoi ce genre de devrait pas poser de problème.Ne sont pas des bibliothèques possible de faire sans au moins un .c fichier?

Était-ce utile?

La solution

Je l'aide a été fait.h à construire la réalité.o et puis à la mettre dans la bibliothèque, il ne fonctionnait pas comme prévu.

Voulez-vous dire vous avez été la compilation fact.h pour produire de l' fact.o?

Si oui, qui n'a pas fait ce que vous attendez.Lorsque vous appelez gcc sur un fichier d'en-tête, il produit un en-tête précompilé, pas un fichier objet.Donc, même si vous avez un fichier appelé foo.o ce n'était pas un objet valide de fichier.Si vous venait de courir gcc -c fact.h il aurait produit un en-tête précompilé fact.gch, mais sans doute que vous avez exécuté gcc -c fact.h -o fact.o ce qui provoque le fichier à être appelé fact.o même si c'est toujours un en-tête précompilé. file fact.o aurait montré que:

$ file fact.o
fact.o: GCC precompiled header (version 013) for C

Vous pourriez avoir forcé GCC pour traiter le fichier de code C, pas un en-tête, en exécutant gcc -x c -c fact.h -o fact.o (le -x c dit pour traiter l'entrée de code C au lieu de déduire le type de l'extension de fichier), mais c'est probablement plus simple et moins source de confusion pour juste le nom de votre fichier correctement au lieu d'essayer de compiler un en-tête.

Ne sont pas des bibliothèques possible de faire sans au moins un .c fichier?

Ils ont besoin d'au moins un fichier de l'objet (c'est à dire .o fichier) mais vous ne disposez pas d'un objet valide, vous avez eu un en-tête précompilé faussement nommé comme .o, mais il n'était pas en fait un objet de fichier.

si je n'utilise pas le -L/.../new, gcc va dire qu'il ne peut pas trouver "lfact", c'est peut-être parce qu'elle n'est pas dans /usr/local/lib

L'éditeur de liens n'est pas seulement regarder dans /usr/local/lib, il y a d'autres emplacements par défaut il regarde, mais oui, c'est fondamentalement le problème.Notez que vous pouvez également dire -L. si la bibliothèque est dans le répertoire courant, c'est plus facile que de donner un chemin absolu.

Autres conseils

Je ne suis pas sûr ar prend en charge un tableau de bord sur rien d'autre que la première option.Essayez

ar -rs libfact.a fact.o

ou tout simplement

ar rs libfact.a fact.o

Rappelez-vous, je ne sais pas pourquoi l'exécution d' ranlib ne fonctionne pas bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top