Question

Supposons que j'ai trois C bibliothèques statiques disent libColor.a qui dépend de * libRGB. * Un qui à son tour dépend de libPixel.a . La bibliothèque libColor.a est dit dépendre de la bibliothèque libRGB.a car il y a quelques références dans libColor.a à certains des symboles définis dans libRGB.a . Comment puis-je combiner toutes les bibliothèques ci-dessus à une nouvelle libNewColor.a qui est indépendant?

indépendant signifie que la nouvelle bibliothèque doit avoir tous les symboles définis. Donc, tout en liant je dois juste donner -lNewColor . La taille de la nouvelle bibliothèque devrait être minimale i.e. il ne devrait pas contenir de symboles dans libRGB.a qui ne sont pas utilisés par libColor.a , etc. J'ai essayé ma chance en utilisant différentes options ar commande (utilisée pour créer et mettre à jour les bibliothèques statiques / archives).

Était-ce utile?

La solution

1 / extraire tous les fichiers d'objets de chaque bibliothèque (en utilisant ar) et essayer de compiler votre code sans les bibliothèques ou l'un des fichiers d'objet. Vous aurez probablement un seau vide absolu de symboles non définis. Si vous obtenez pas de symboles non définis, passez à l'étape 5.

2 / Prenez le premier et savoir quel objet satisfait de fichier symbole (en utilisant nm).

3 / Notez que le fichier objet puis compiler votre code, y compris le nouveau fichier objet. Vous obtenez une nouvelle liste de symboles non définis ou, s'il n'y en a pas, passez à l'étape 5.

4 / Aller à l'étape 2.

5 / Combiner tous les fichiers objets dans votre liste (le cas échéant) en une seule bibliothèque (encore une fois avec <=>).

Bang! Voilà. Essayez de lier votre code sans aucun des objets mais avec la nouvelle bibliothèque.

pourrait être automatisé relativement facilement cette histoire avec un script shell.

Autres conseils

Une petite fonctionnalité utilisée de la archiveur GNU est le script d'archive, il est une interface simple mais puissante, et il peut faire exactement ce que vous voulez, par exemple, si le script suivant est appelé script.ar:

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
SAVE
END

Ensuite, vous pouvez invoquer ar comme suit:

ar -M < script.ar

et vous obtiendrez libNewColor.a qui contient tous les fichiers .o de libColor.a libRGB.a et libPixel.a.

vous pouvez en outre ajouter des fichiers .o réguliers aussi bien avec la commande ADDMOD:

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
ADDMOD someRandomCompiledFile.o
SAVE
END

En outre, il est très facile de générer ces scripts dans Makefile, donc je crée généralement une règle de makefile un peu générique pour créer des archives qui génère en fait le script et Invoque ar sur le script. Quelque chose comme ceci:

$(OUTARC): $(OBJECTS)
    $(SILENT)echo "CREATE $@" > $(ODIR)/$(ARSCRIPT)
    $(SILENT)for a in $(ARCHIVES); do (echo "ADDLIB $$a" >> $(ODIR)/$(ARSCRIPT)); done
    $(SILENT)echo "ADDMOD $(OBJECTS)" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "SAVE" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "END" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)$(AR) -M < $(ODIR)/$(ARSCRIPT)

Bien que maintenant que je regarde, je suppose que cela ne fonctionne pas si $ (objets) est vide (si vous voulez juste de combiner les archives sans l'ajout de fichiers d'objets supplémentaires) mais je vais le laisser comme un exercice pour le lecteur pour résoudre ce problème si nécessaire ...: D

Voici les documents pour cette fonction:

https://sourceware.org/binutils/docs/binutils/ar-scripts .html # ar-scripts

Une bibliothèque statique est pas beaucoup plus d'une archive de certains fichiers objets (.o). Ce que vous pouvez faire est d'extraire tous les objets dans les deux bibliothèques (en utilisant « ar x ») et utilisez ensuite « ar » pour les relier entre eux dans une nouvelle bibliothèque.

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