Cela me semble étrange d'utiliser -Wl,-Bstatic
pour diregcc
quelles bibliothèques je veux établir un lien statique. Après tout, je dis gcc
directement 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 gcc
de 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.
la source
-l:
option est-elle documentée? De quelle version de gcc ai-je besoin pour l'utiliser?ld
linker 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.htmlVous pouvez ajouter un fichier .a dans la commande de liaison:
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,-Bstatic
et-Wl,-Bdynamic
. Voici une page de manuel de gnu LD: http://linux.die.net/man/1/ldPour lier votre programme avec lib1, lib3 dynamiquement et lib2 statiquement, utilisez un tel appel gcc:
En supposant que le paramètre par défaut de ld est d'utiliser des bibliothèques dynamiques (c'est sous Linux).
la source
gcc
.gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3
fait l'affaire.-l
et-L
sont également des options de l'éditeur de liens.gcc yourfiles /path/to/library/libLIBRARY.a
ou-Wl,-Bstatic
?/path/to/library/libLIBRARY.a
besoin d'un chemin complet pour être écrite, la variante 2-Wl,-Bstatic -llib2 -Wl,-Bdynamic
est 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.a
est 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.