188 votes

Dire à gcc de lier statiquement une bibliothèque

Il me semble étrange d'utiliser -Wl,-Bstatic pour dire gcc les bibliothèques avec lesquelles je souhaite établir des liens statiques. Après tout, je dis à gcc directement toutes les autres informations relatives à l'établissement de liens avec des bibliothèques ( -Ldir , -llibname ).

Est-il possible d'indiquer directement au pilote gcc les bibliothèques qui doivent être liées statiquement ?

Clarification : Je sais que si une certaine bibliothèque n'existe que dans les versions statiques, il l'utilisera sans que cela ne soit nécessaire. -Wl,-Bstatic mais je veux impliquer gcc pour préférer la bibliothèque statique. Je sais également qu'en spécifiant directement le fichier de la bibliothèque, il sera possible d'établir un lien avec elle, mais je préfère conserver la même sémantique pour l'inclusion des bibliothèques statiques et dynamiques.

291voto

Radek Points 31

Utilisation -l: au lieu de -l . Par exemple -l:libXYZ.a à relier avec libXYZ.a . Remarquez que les lib y .a sont écrites, contrairement à -lXYZ qui s'étendrait automatiquement à libXYZ.so / libXYZ.a .

Il s'agit d'un de l'option GNU ld lien :

-l namespec ... Si nom est de la forme :filename , ld recherchera dans le chemin de la bibliothèque un fichier appelé nom de fichier Sinon, il recherchera dans le chemin de la bibliothèque un fichier appelé libnamespec.a . ... sur les systèmes ... ELF, ld recherchera dans un répertoire une bibliothèque appelée libnamespec.so avant d'en rechercher un appelé libnamespec.a . ... Notez que ce comportement ne s'applique pas aux :filename qui spécifie toujours un fichier appelé nom de fichier ."

(Depuis binutils 2.18 )

Notez que cela ne fonctionne qu'avec l'éditeur de liens GNU. Si votre ld n'est pas celui de GNU, vous n'avez pas de chance.

171voto

osgx Points 28675

Vous pouvez ajouter le fichier .a dans la commande de liaison :

  gcc yourfiles /path/to/library/libLIBRARY.a

Mais il ne s'agit pas d'un pilote gcc, mais d'un pilote ld comme des options telles que -Wl,anything sont.

Lorsque vous dites à gcc ou à ld -Ldir -lLIBRARY l'éditeur de liens vérifiera les versions statiques et dynamiques de la bibliothèque (vous pouvez voir un processus avec -Wl,--verbose ). Pour modifier l'ordre des types de bibliothèques vérifiés, vous pouvez utiliser la fonction -Wl,-Bstatic y -Wl,-Bdynamic . Voici une page de manuel de gnu LD : http://linux.die.net/man/1/ld

Pour lier votre programme avec lib1, lib3 dynamiquement et lib2 statiquement, utilisez un appel gcc de ce type :

gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3

En supposant que le paramètre par défaut de ld soit l'utilisation de bibliothèques dynamiques (c'est le cas sous Linux).

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