J'ai 2 statiques bibliothèques Linux, créées par ar cr
, libabc.a
et libxyz.a
.
Je veux les fusionner dans une bibliothèque statique libaz.a
.
Comment puis-je faire ceci.
Je veux créer une bibliothèque statique fusionnée, pas pour donner les deux bibliothèques au lien final des applications.
linux
static-libraries
ar
osgx
la source
la source
libtool
libtool -static -o new.a old1.a old2.a
Réponses:
Vous pouvez extraire l'objet des deux
.a
fichiers et créer votre.a
fichier en utilisant les.o
s extraits :la source
libabc.a
peut contenir des objets ayant le même nom (provenant de répertoires différents) - le réassemblage ne fonctionnera pas alors!ar -c
n'a pas fonctionné pour moi (Ubuntu 14.04). J'aiar: no operation specified
. Je l'ai fait à laar -qc
place et cela a bien fonctionné.Il existe au moins trois façons de procéder de manière native . La première manière et la plus portable est d'utiliser libtool. Après avoir construit les autres bibliothèques également avec libtool, vous pouvez les combiner simplement en ajoutant les libs .la à une variable automake libaz_la_LIBADD, ou directement à partir d'un Makefile avec quelque chose comme:
Les deux autres sont au moins disponibles lors de l'utilisation de GNU ar. Vous pouvez utiliser un script MRI (nommé par exemple libaz.mri), tel que:
puis exécutez ar comme:
Ou vous pouvez utiliser une archive fine (option
-T
), qui permettra d'ajouter d'autres archives sans les imbriquer à l'intérieur, bien que l'inconvénient soit que si vous souhaitez distribuer la bibliothèque statique, l'objet détaché sera manquant:Toutes les méthodes ci-dessus gèrent gracieusement les noms de membres qui se chevauchent à partir des archives d'origine.
Sinon, vous devrez décompresser dans différents répertoires et reconditionner à nouveau, pour éviter de remplacer les noms de membres qui se chevauchent:
la source
ar cqT libaz.a libabc.a libxyz.a && echo -e 'create libaz.a\naddlib libaz.a\nsave\nend' | ar -M
. Cela crée unelibaz.a
archive légère temporaire , puis convertit l'archive légère en une archive normale (vous pouvez donc la déplacer / la distribuer). Cela gère également gracieusement lorsque les noms de votre bibliothèque ont des caractères spéciaux (espacés, plus ou virgules) (iear cqT libbundle.a libfoo++.a 'libbar baz.a'
). Mais +1 de moi!libtool
que j'obtiens ces erreurs:libtool: link: unable to infer tagged configuration libtool: error: specify a tag with '--tag'
Des idées pour résoudre ce problème?--Wl,-whole-archive
option est requise dans la commande de liaison d'origine pour plusieurs lib * .a, et que je dois combiner toutes les lib * .a dansone.a
. Lors de la liaison à nouveau,--Wl,-whole-archive
ne fonctionnera pas avecone.a
. Quelle est votre suggestion? stackoverflow.com/questions/56323197/…Si vous le faites simplement comme:
vous perdrez certains fichiers objets s'il y a des membres avec le même nom dans aa et ba, vous devez donc extraire les membres de différentes archives dans un dossier différent:
de plus, il est possible qu'il y ait plusieurs membres du même nom dans une archive (disons dans aa), si vous exécutez ar x aa , vous n'en obtiendrez qu'un pour les membres du même nom.
La seule façon d'extraire tous les membres du même nom dans une archive est de spécifier le numéro de membre par l'option 'N':
ce serait un travail fastidieux, vous devrez donc écrire un script plus sophistiqué pour faire ce travail.
Une solution facultative est que vous pouvez combiner plusieurs archives dans une bibliothèque partagée:
de cette façon, l'éditeur de liens gérera tout pour vous!
la source
-fPIC
.Mieux encore, vous effectuez un lien partiel sur chaque bibliothèque et faites une archive des deux fichiers objets résultants. De cette façon, il fonctionne comme les bibliothèques partagées le feraient
Vous faites un lien partiel avec
donc soit au lieu de créer l'archive intermédiaire, soit après l'avoir réextrait, exécutez
puis
la source
maintenant vous avez deux versions de "macroblock-10.o"
la source
Ici, vous créez une archive d'archives, puis vous «aplatissez» le résultat avec le drapeau T. Je ne sais pas comment cela fonctionnera avec les fichiers .o du même nom qui pourraient être contenus dans.
la source