Question

Un peu de contexte. Disons que j'ai des fichiers source, qui doivent se retrouver dans une bibliothèque statique. Disons qu'il y a deux fichiers cpp a.cpp et a.cpp situés dans deux sous-répertoires différents. Quelque chose comme ça:

foo/a.h
foo/a.cpp
bar/a.h
bar/a.cpp

Leur contenu n'est pas contradictoire et est complètement différent. Les noms de fichiers sont identiques.

Maintenant, lors de la compilation, je me retrouve bien sûr avec deux fichiers a.o.

gcc -c foo/a.cpp -o foo/a.o
gcc -c bar/a.cpp -o bar/a.o

Si je crée une bibliothèque statique maintenant avec

ar rcs libfoobar.a foo/a.o bar/a.o

Je peux voir les deux fichiers dans la bibliothèque statique exécutant nm libfoobar.a. Ça a l'air bien.

< gagnantProblème

Le problème que je peux voir est si j'exécute la commande ar individuellement pour foo/a.o et bar/a.o en les mettant dans la même bibliothèque statique. Maintenant, le dernier fichier objet écrasera le premier, donc lors de l'exécution de nm libfoobar.a, je vois juste le dernier objet dans la bibliothèque. Je suppose que c'est le cas en raison du même nom de fichier objet.

Lors de la création d'une bibliothèque statique avec ar, dois-je toujours combiner tous les objets en une seule fois ou est-il également correct d'exécuter ar plusieurs fois en collectant une partie des objets à la fois, tous finissant dans la même bibliothèque statique? Pour cet exemple, je peux voir les premières œuvres, mais pas les dernières.

Comment les choses fonctionneront-elles quand un a.cpp change et que la bibliothèque statique doit changer? ar trouvera-t-il le bon a.cpp à changer dans la bibliothèque?

Ceci n'est qu'un petit exemple, mais considérons un grand projet avec de nombreux fichiers et certains ont le même nom. Si vous souhaitez maintenant créer une seule bibliothèque, vous pourriez également vous retrouver avec cette situation.

En général, est-ce juste une mauvaise organisation de la façon dont les bibliothèques sont composées, comment les fichiers sont nommés ou y a-t-il autre chose à cela pour faire fonctionner les choses?

Était-ce utile?

La solution

Vous devez considérer ar comme un très ancien archiveur de fichiers. Il ne sait même rien de l'archivage d'un répertoire. (les archives ar sont plates)

(man ar): ar - create, modify, and extract from archives

man ar, option r:

r Insérez le fichier membre ... dans l'archive (avec remplacement). Cette opération diffère de q en ce que tous les membres déjà existants sont supprimés si leurs noms correspondent à ceux ajoutés .

Essayez d'exécuter un ar t libfoobar.a et vous ne verrez que les fichiers a.o car ar n'a pas stocké le nom du répertoire dans l'archive.

Vous devez donc nommer différemment tous les fichiers objets placés dans une archive ar (UPD) si vous voulez faire une mise à jour de certains fichiers objets dans la bibliothèque avec ar

Le ar rcs lib.a foo/a.o bar/a.o remplace a.o trouvé dans la lib.a, mais il ne vérifie pas les fichiers ajoutés pour la collision de noms.

Autre cas: ar rcs lib.a foo/a.o et ar rcs lib.a bar/a.o stockeront un premier a.o dans l'archive, puis le second ar trouvera l'ancien a.o dans l'archive et remplacera l'ancien fichier.

Autres conseils

Une bibliothèque est juste une collection de fonctions et / ou de données regroupées par fichiers objets dans la bibliothèque et ces fichiers objets ont un nom.Ces noms ne jouent aucun autre rôle que celui de la mise à jour / l'extraction / la suppression de celui-ci.

C'est pourquoi il est parfaitement légal d'avoir deux noms identiques pour deux fichiers objets ou plus. Lors de la mise à jour de la bibliothèque, le bibliothécaire remplace le premier objet par le nom que vous remplacez et ne cherche pas plus loin.

Ce n'est cependant pas une chose intelligente à faire.

Je ne peux répondre qu'à une partie de votre question.À partir de la syntaxe Makefile, nous voyons que c'était une manière normale de mettre à jour un seul objet.Mais par exemple, l'approche d'automake est de reconstruire la bibliothèque à partir de zéro même si un fichier est modifié.Cela ne pose plus de gros problème maintenant ...

Désolé, je n'ai pas d'Unix sous la main pour le moment, donc nous attendrons toujours qu'un expert réponde :)

D'après ma propre expérience, je ne recommanderais pas d'avoir deux fichiers avec le même nom dans une bibliothèque statique.

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