N'est-il pas permis de créer une bibliothèque statique sans .c fichier?
-
13-12-2019 - |
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?
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.