45 votes

Comment combiner plusieurs bibliothèques C/C++ en une seule ?

J'en ai assez d'ajouter dix bibliothèques de liens dans mon projet, ou d'en exiger huit pour utiliser la mienne. J'aimerais prendre des bibliothèques existantes comme libpng.a, libz.a, libjpeg.a, et les combiner en une seule bibliothèque .a. Est-ce possible ? Qu'en est-il de la combinaison des bibliothèques .lib ?

27voto

Judge Maygarden Points 14964

Vous pouvez extraire les fichiers objets de chaque bibliothèque avec

ar x <library name>

et ensuite les fusionner dans une nouvelle bibliothèque avec

ar cs <new library name> <list each extracted object file>

0 votes

Cela ne fonctionne pas sur tous les ar. En lisant le manuel, j'ai constaté que les versions antérieures de l'ar sont plus faciles à faire : sh4-linux-ar r <existinglib.a> *.o pour ajouter d'autres symboles à existinglib.a

0 votes

Cela poserait également des problèmes de longueur de ligne de commande. La compilation des fichiers .a/.lib est souvent utilisée pour contourner la limitation WIN32 de 4096 caractères sur la ligne de commande (on ne peut pas avoir trop de .o à la fois pour lier ou créer la bibliothèque).

3 votes

Soyez conscient que si deux de vos bibliothèques contiennent des membres avec les mêmes noms, alors l'approche naïve de unpack-libraries-into-directory-and-repack échouera --- un des membres sera perdu. Vous devrez renommer l'un des membres pour éviter un conflit.

9voto

Avner Points 2065

Sur les systèmes de type Unix, les utilitaires ld et ar peuvent le faire. Consultez http://en.wikipedia.org/wiki/Ar_(Unix) ou consultez les pages de manuel sur n'importe quelle machine linux ou via google, par exemple 'unix man ar'.

Veuillez noter qu'il est préférable de créer un lien vers une bibliothèque partagée (dynamique). Cela ajoutera une dépendance à votre exécutable mais réduira considérablement sa taille, surtout si vous écrivez une application graphique.

1 votes

Pourquoi une taille d'image plus petite est-elle préférable dans les applications graphiques ?

1 votes

Une image de petite taille est généralement préférable. Les bibliothèques graphiques (xlib et. al.) ont tendance à être très grandes et font donc des exécutables très grands s'ils sont liés statiquement.

0 votes

Ohh donc vous vouliez parler des applications GUI. Je pensais que tu faisais référence aux graphiques comme dans les moteurs 3D avec les shaders GPU et autres...

0voto

Greg Whitfield Points 3651

Peut-être que je ne comprends pas bien, mais ne devez-vous pas expédier les librairies uniquement si le code de l'utilisateur final les appelle directement ? Si l'accès aux méthodes Jpeg, etc., se fait à partir de votre code dans votre bibliothèque statique, il suffit de lier les librairies à votre bibliothèque.

I.e.

----------------
| End-user exe |
----------------
      |
      | makes calls to
      |
      v
 --------------------
 | Your static lib.a | 
 --------------------
         | makes calls to and links
         v
     ------------------------------------ .....
     |                    |         |
  -------------    -------- ---------- 
  | libjpeg.a |    |libz.a| |libpng.a|
  -------------    -------- ----------

C'est-à-dire que ce n'est un problème que si le code final doit faire des appels directs à libz.a, libpng.a, etc.

Si le code de l'application a un besoin légitime d'appeler libz.a, par exemple, alors il s'agirait, comme mentionné ci-dessus, d'un cas d'utilisation d'un module dynamique.

PS : Est-ce que je reçois un badge d'artiste ? :)

16 votes

Non, vous ne faites pas de lien lorsque vous créez "votre lib.a statique". La liaison n'est effectuée que lors de la création de l'exécutable final. C'est précisément la raison pour laquelle la question a été posée.

0 votes

Je suis désolé Trent, vous avez tort. La liaison s'applique aux bibliothèques, pas seulement aux EXE.

3 votes

@Greg ; Trent a raison. Créer une bibliothèque consiste simplement à rassembler des fichiers objets dans une archive avec une table de symboles. Il n'y a pas de compilateur (cc) ou d'éditeur de liens (ld), juste un outil d'archivage (ar).

0voto

Ed. Points 1012

Je ne sais pas comment les combiner physiquement en un seul fichier, mais vous pourriez employer une sorte d'abstraction et inclure un seul "AllMyLibs.a/h" qui, à son tour, inclut tout ce que vous voulez. Vous pourriez également placer ce fichier à l'endroit où votre compilateur recherche les bibliothèques, de sorte que cela fonctionnerait pour n'importe quel projet.

P.S. - Par curiosité, pourquoi n'aimez-vous pas inclure les libéraux simples ?

-2voto

tuxedo Points 299

La combinaison de plusieurs bibliothèques tierces en une seule peut vous poser davantage de problèmes, par exemple si deux de ces bibliothèques définissent un symbole commun que votre programme n'utilise pas. Vous devez alors extraire toutes les instances du symbole commun (ou toutes les instances sauf une) avant de combiner les bibliothèques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X