J'ai un petit morceau de code qui dépend de nombreuses bibliothèques statiques (a_1-a_n). J'aimerais empaqueter ce code dans une bibliothèque statique et le rendre disponible à d'autres personnes.
Ma bibliothèque statique, appelons-la X, se compile très bien.
J'ai créé un exemple de programme simple qui utilise une fonction de X, mais lorsque j'essaie de la lier à X, j'obtiens de nombreuses erreurs concernant les symboles manquants dans les bibliothèques a_1 - a_n.
Existe-t-il un moyen de créer une nouvelle bibliothèque statique, Y qui contient X et toutes les fonctionnalités nécessaires à X (bits sélectionnés de a_1 - a_n), afin que je puisse distribuer uniquement Y pour que les gens puissent lier leurs programmes?
METTRE À JOUR:
J'ai regardé simplement vider tout avec ar et créer une méga-lib, cependant, qui finit par inclure beaucoup de symboles qui ne sont pas nécessaires (tous les fichiers .o font environ 700 Mo, cependant, un exécutable lié statiquement est 7 MB). Existe-t-il une bonne façon de n'inclure que ce qui est réellement nécessaire?
Cela semble étroitement lié à Comment combiner plusieurs bibliothèques C / C ++ en une seule? .
-r
avec laquelle la sortie peut être utilisée comme entrée pour ld. Si vous créez un lien une fois que vous devriez obtenir un relocalisable, vous pouvez remplacer vos bibliothèques. (Je l'ai essayé thogh).Si vous utilisez Visual Studio, oui, vous pouvez le faire.
L'outil de création de bibliothèque fourni avec Visual Studio vous permet de joindre des bibliothèques ensemble sur la ligne de commande. Cependant, je ne connais aucun moyen de le faire dans l'éditeur visuel.
la source
Sous Linux ou MingW, avec la chaîne d'outils GNU:
De si vous ne supprimez pas
liba.a
etlibb.a
, vous pouvez créer une "archive légère":Sous Windows, avec la chaîne d'outils MSVC:
la source
ar crsT
, qui fait quelque chose comme "symlinking" au lieu de copier, alors vous n'avez qu'à expédier une copie des données.Une bibliothèque statique n'est qu'une archive de
.o
fichiers objets. Extrayez-les avecar
(en supposant Unix) et remettez-les dans une grande bibliothèque.la source
Vous pouvez également à
Link Library Dependencies
des propriétés du projet il y a une autre façon de bibliothèques de liens dans Visual Studio.Add Existing Item...
).Item Type
estLibrary
Cela inclura les autres bibliothèques de X comme si vous exécutiez
la source
Remarque avant de lire la suite: le script shell montré ici n'est certainement pas sûr à utiliser et bien testé. À utiliser à vos risques et périls!
J'ai écrit un script bash pour accomplir cette tâche. Supposons que votre bibliothèque soit lib1 et que celle dont vous ayez besoin pour inclure certains symboles soit lib2. Le script s'exécute maintenant dans une boucle, où il vérifie d'abord quels symboles non définis de lib1 peuvent être trouvés dans lib2. Il extrait ensuite les fichiers objets correspondants de la lib2 avec
ar
, les renomme un peu et les met dans lib1. Maintenant, il peut y avoir plus de symboles manquants, parce que les éléments que vous avez inclus de lib2 ont besoin d'autres éléments de lib2, que nous n'avons pas encore inclus, donc la boucle doit être exécutée à nouveau. Si après quelques passages de la boucle il n'y a plus de changements, c'est-à-dire qu'aucun fichier objet de la lib2 n'a été ajouté à la lib1, la boucle peut s'arrêter.Notez que les symboles inclus sont toujours signalés comme non définis par
nm
, donc je garde une trace des fichiers objets, qui ont été ajoutés à lib1, eux-mêmes, afin de déterminer si la boucle peut être arrêtée.J'ai nommé ce script
libcomp
, donc vous pouvez l'appeler alors par exemple avecoù libwthing est d'où vous voulez inclure des symboles. Cependant, je pense qu'il est plus sûr de tout copier d'abord dans un répertoire séparé. Je ne ferais pas tellement confiance à mon script (cependant, cela a fonctionné pour moi; je pourrais inclure libgsl.a dans ma bibliothèque numérique avec cela et laisser de côté ce commutateur de compilateur -lgsl).
la source