web-dev-qa-db-fra.com

Indiquer directement à gcc de lier statiquement une bibliothèque

Il me semble étrange d’utiliser -Wl,-Bstatic pour indiquer à gcc les bibliothèques avec lesquelles je veux créer un lien statique. Après tout, je communique directement à gcc toutes les autres informations sur la liaison avec des bibliothèques (-Ldir, -llibname).

Est-il possible de dire 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 pour préférer la bibliothèque statique. Je sais également que spécifier le fichier de bibliothèque directement serait lié à celui-ci, mais je préfère conserver la même sémantique pour inclure les bibliothèques statiques et dynamiques.

107
Elazar Leibovich

Il est bien sûr possible d’utiliser -l: au lieu de -l. Par exemple, -l:libXYZ.a pour créer un lien avec libXYZ.a. Notez le lib écrit, par opposition à -lXYZ qui se développerait automatiquement en libXYZ.

153
Radek

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

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

Mais ce n'est pas parler avec le pilote gcc, mais avec ld l'éditeur de liens comme options comme -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èque cochés, vous pouvez utiliser -Wl,-Bstatic et -Wl,-Bdynamic. Voici une page de manuel de gnu LD: http://linux.die.net/man/1/ld

Pour lier votre programme à lib1, lib3 dynamiquement et lib2 statiquement, utilisez l’appel gcc suivant:

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).

115
osgx