Question

J'en ai assez d'ajouter dix bibliothèques de liens à mon projet ou d'exiger que huit d'entre elles utilisent 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?Que diriez-vous de combiner les bibliothèques .lib ?

Était-ce utile?

La solution

Sur les systèmes de type Unix, les utilitaires ld et ar peuvent le faire.Vérifier http://en.wikipedia.org/wiki/Ar_(Unix) ou recherchez les pages de manuel sur n'importe quelle machine Linux ou via Google, par exemple « unix man ar ».

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

Autres conseils

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

ar x <library name>

puis fusionnez-les tous dans une nouvelle bibliothèque avec

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

Sous Linux ou MinGW ou Cygwin, avec la chaîne d'outils GNU :

ar -M <<EOM
    CREATE libab.a
    ADDLIB liba.a
    ADDLIB libb.a
    SAVE
    END
EOM
ranlib libab.a

Ou si vous pouvez conserver l'existence de liba.a et libb.a:

ar crsT libab.a liba.a libb.a

Sous Windows, avec la chaîne d'outils MSVC :

lib.exe /OUT:libab.lib liba.lib libb.lib

Peut-être que je me trompe, mais ne devez-vous pas expédier les bibliothèques uniquement si le code de l'utilisateur final les appelle directement ?Si tous les accès aux méthodes Jpeg, etc. proviennent de votre code dans votre bibliothèque statique, liez simplement les bibliothèques à votre bibliothèque.

C'est à dire.

----------------
| 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 effectuer des appels directs vers libz.a, libpng.a etc.

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

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

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

P.S.- Par curiosité, pourquoi n'aimez-vous pas inclure des bibliothèques uniques ?

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

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