Dire directement à gcc de lier une bibliothèque de manière statique

133

Cela me semble étrange d'utiliser -Wl,-Bstaticpour diregcc quelles bibliothèques je veux établir un lien statique. Après tout, je dis gccdirectement toutes les autres informations sur la liaison avec les bibliothèques ( -Ldir, -llibname).

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

Clarification: je sais que si une certaine bibliothèque n'existe que dans des versions statiques, elle l'utilisera sans -Wl,-Bstatic, mais je veux impliquer gccde préférer la bibliothèque statique. Je sais aussi que la spécification directe du fichier de bibliothèque créerait un lien avec lui, mais je préfère garder la sémantique pour inclure les bibliothèques statiques et dynamiques de la même manière.

Elazar Leibovich
la source

Réponses:

189

Il est bien sûr possible d'utiliser à la -l:place de -l. Par exemple -l:libXYZ.apour créer un lien avec libXYZ.a. Notez l' libécrit, par opposition à celui -lXYZqui se développerait automatiquement libXYZ.

Radek
la source
63
Dieu si seulement Gnu avait fait de cela la valeur par défaut en premier lieu au lieu du préfixe lib folie. Oh le temps et la frustration que nous aurions économisé.
Timmmm
9
Radek, cette -l:option est-elle documentée? De quelle version de gcc ai-je besoin pour l'utiliser?
osgx
18
En fait, c'est l'option du ldlinker sourceware.org/binutils/docs/ld/Options.html " -l namespec.. Si namespec est de la forme: filename, ld recherchera dans le chemin de la bibliothèque un fichier appelé filename, sinon il recherchera la bibliothèque chemin d'un fichier appelé libnamespec.a. .. sur les systèmes ELF .., ld cherchera dans un répertoire une bibliothèque appelée libnamespec.so avant d'en rechercher une appelée libnamespec.a. .. Notez que ce comportement ne s'applique pas à: filename , qui spécifie toujours un fichier appelé filename. ". Depuis binutils 2.18 - sourceware.org/binutils/docs-2.18/ld/Options.html
osgx
17
GNU n'est nulle part responsable de cette interface, elle a été héritée de la chaîne d'outils Unix.
akim
C'est vraiment dommage que cela ne fonctionne pas dans les éditeurs de liens non GNU. C'est un bon moyen de "forcer" LDLIBS et des options de configuration similaires à trouver des bibliothèques statiques sans des solutions de contournement étranges d'indicateur de lien.
nneonneo
130

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

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

Mais cela ne parle pas avec le pilote gcc, mais avec l' ldéditeur de liens comme options comme-Wl,anything .

Lorsque vous indiquez 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 cochés, vous pouvez utiliser -Wl,-Bstaticet -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 tel appel gcc:

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

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

osgx
la source
3
Version courte: il n'y a aucun moyen de faire cela avec le courant gcc.
Elazar Leibovich
7
Elazar Leibovich, mais gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3fait l'affaire.
osgx
13
La liaison (et la recherche des bibliothèques dynamiques / statiques) est effectuée par l'éditeur de liens, vous devez donc utiliser les options de l'éditeur de liens. -let -Lsont également des options de l'éditeur de liens.
osgx
3
Cette réponse a-t-elle été votée à cause de gcc yourfiles /path/to/library/libLIBRARY.aou -Wl,-Bstatic?
Tor Klingberg
7
@TorKlingberg, la variante 1 a /path/to/library/libLIBRARY.abesoin d'un chemin complet pour être écrite, la variante 2 -Wl,-Bstatic -llib2 -Wl,-Bdynamicest juste longue et ajoute 2 options supplémentaires et suppose le mode par défaut comme Bdynamic, et la variante acceptée 3 -l:libXYZ.aest courte et fonctionne juste. Les trois fonctionneront dans de nombreux cas et la variante 2 peut ne pas fonctionner lors de la liaison de programmes statiques. L'étape de liaison réelle pour la bibliothèque est la même dans toutes les variantes que je comprends.
osgx