En combinant les bibliothèques statiques
Supposons que j'ai trois C bibliothèques statiques dire libColor.un qui dépend de l' *libRGB.*un qui dépend à son tour libPixel.un . La bibliothèque libColor.un est dit à dépendre de la bibliothèque libRGB.un depuis il y a quelques références dans libColor.un à certains des symboles définis dans libRGB.un. Comment puis-je combiner toutes les bibliothèques ci-dessus pour une nouvelle libNewColor.un qui est indépendant?
Moyens indépendants de la nouvelle bibliothèque devrait avoir tous les symboles définis. Donc, tout en les reliant j'ai juste besoin de donner -lNewColor. La taille de la nouvelle bibliothèque devrait être minime je.e il ne doit pas contenir les symboles dans libRGB.un qui n'est pas utilisée par libColor.un etc.
J'ai tenté ma chance à l'aide de différentes options de ar de commande (utilisé pour créer et mettre à jour les bibliothèques statiques/archives).
Notez que la minimisation de l'étape n'est pas vraiment nécessaire. Avec les bibliothèques statiques, l'éditeur de liens ne saisissez l'objet fichiers dont il a besoin, à la différence des bibliothèques partagées qui comprennent tout. Il y a des raisons et les avantages de chaque approche, elles sont simplement différentes. Et vous n'avez vraiment pas besoin de s'inquiéter lorsque vous travaillez avec des bibliothèques statiques.
OriginalL'auteur AIB | 2009-03-20
Vous devez vous connecter pour publier un commentaire.
1/Extraire TOUS les fichiers de l'objet de chaque bibliothèque (à l'aide de
ar
) et essayez de compiler votre code sans les bibliothèques ou de l'une de fichiers de l'objet. Vous obtiendrez probablement une absolue seau en charge de symboles non définis. Si vous n'obtenez pas les symboles non définis, passez à l'étape 5.2/Prenez la première et de trouver quel fichier objet satisfait de ce symbole (à l'aide de
nm
).3/Écrire le long de l'objet fichier puis compilez votre code, y compris le nouveau fichier de l'objet. Vous aurez une nouvelle liste de symboles non définis ou, si il n'y a aucun, passez à l'étape 5.
4/Passez à l'étape 2.
5/Combiner tous les fichiers objets dans votre liste (le cas échéant) dans une seule bibliothèque (de nouveau avec
ar
).Bang! Il vous en avez. Essayez de lier votre code sans les objets, mais avec la nouvelle bibliothèque.
Tout cela pourrait être relativement facilement automatisé avec un script shell.
voulait la taille de la bibliothèque pour être minimes, pas de la taille de l'exécutable.
L'accepter,même si j'aimerais bien un oneliner qui le fait. Comme le passage de quelques options pour ld de lien avec uniquement les symboles nécessaires etc...
la fonctionnalité n'est pas jugé nécessaire. Lorsque vous créez un lien avec une bibliothèque statique, il n'est pas tirer dans tout ce à partir de la bibliothèque pour rendre le fichier exécutable. Il apporte seulement des fichiers de l'objet dans la bibliothèque pour satisfaire les symboles non définis.
Donc la taille de la executable est réduite à seulement ce dont il a besoin. L'éditeur de liens (ld) seulement introduire les symboles nécessaires. Votre question initiale était d'environ minimisant la taille de la librairie - si vous voulait vraiment dire la taille de l'exécutable, c'est déjà fait pour vous.
OriginalL'auteur paxdiablo
Un peu utilisé la fonctionnalité de la GNU archiver est le script d'archive, c'est un simple mais puissant de l'interface, et il peut faire exactement ce que vous voulez, par exemple, si le script suivant est appelé script.ar:
Alors vous pourriez invoquer ar comme suit:
et vous obtenez libNewColor.un qui contient toutes les .o fichiers à partir de libColor.un libRGB.un et libPixel.un.
En outre, vous pouvez également ajouter régulièrement .o les fichiers avec l'ADDMOD commande:
En outre, il est super facile de générer de ces scripts dans les fichiers Makefile, j'ai donc créer généralement un peu makefile générique de la règle pour la création d'archives qui génère le script et appelle ar sur le script. Quelque chose comme ceci:
Mais maintenant que je le regarde j'imagine que ça ne fonctionne pas si $(OBJETS) est vide (c'est à dire si vous voulez juste de combiner des archives sans ajout de fichiers de l'objet), mais je vais laisser ça comme un exercice pour le lecteur de corriger ce problème si nécessaire... 😀
Voici la doc de cette fonction:
https://sourceware.org/binutils/docs/binutils/ar-scripts.html#ar-scripts
Neat! C'est une façon, de manière plus facile que le déballage et le remballage de fichiers objet vous-même.
Notez que pour certaines raisons -D ne fonctionne pas en combinaison avec -M. Donc, si vous voulez obtenir des résultats déterministes, vous avez encore besoin de l'extrait-puis-archive route.
OriginalL'auteur Chris Desjardins
Une bibliothèque statique n'est pas beaucoup plus qu'une archive de certains fichiers objets (.o). Ce que vous pouvez faire est d'extraire tous les objets dans les deux bibliothèques (à l'aide de "ar x") puis utilisez la fonction "ar" pour les relier ensemble dans une nouvelle bibliothèque.
OriginalL'auteur Mark Probst