2010-12-12 35 views
12

Ceci est une citation du livre de programmation Linux:comment forcer l'éditeur de liens à utiliser la bibliothèque partagée au lieu de la bibliothèque statique?


% gcc -o app app.o -L. –ltest

Supposons que les deux libtest.a et libtest.so sont available.Then l'éditeur de liens doit choisir l'une des bibliothèques et non l' L'éditeur de liens recherche dans chaque répertoire (d'abord ceux spécifiés avec -L options, puis ceux dans les répertoires standard) .Lorsque l'éditeur de liens trouve un répertoire qui contient soit libtest.a ou libtest.so, l'éditeur de liens arrête répertoires de recherche. Si une seule des deux variantes est présente dans le répertoire, l'éditeur de liens choisit cette variante. Sinon, l'éditeur de liens choisit la version de la bibliothèque partagée, à moins que vous ne l'indiquiez explicitement autrement. Vous pouvez utiliser l'option -static pour demander des archives statiques . Par exemple, la ligne suivante utilisera l'archive libtest.a, même si la libtest.so bibliothèque partagée est également disponible:

% gcc -static -o app app.o -L. –ltest


Depuis si l'éditeur de liens rencontre le répertoire qui contient libtest.a il arrête la recherche et les utilisations cette bibliothèque statique, comment forcer l'éditeur de liens à rechercher uniquement la bibliothèque partagée, et non pas statique?

% gcc -o app app.o -L. libtest.so?

Répondre

14

Vous pouvez utiliser l'option -l sous sa forme -l:filename si votre éditeur de liens supporte (les anciennes versions de ld ne l'ont pas)

gcc -o app app.o -L. -l:libtest.so 

Une autre option est d'utiliser le nom de fichier directement sans -l et -L

gcc -o app app.o /path/to/library/libtest.so 
+0

Note: Cette utilisation de '-l' est non documentée. Il inclura le chemin d'accès complet à la bibliothèque dans l'exécutable, ce qui signifie que la bibliothèque ne pourra jamais être déplacée de son emplacement actuel. –

+1

@KevinPanko L'option '-l' est documentée dans' man ld', https: //linux.die.net/man/1/ld - Je ne peux pas facilement le tester mais selon le doc: Si namespec est de la forme ': filename ',' ld' cherchera dans le chemin de la bibliothèque un fichier appelé 'filename'. Comme je l'ai mentionné, les anciennes versions de 'ld' ne supportent pas cette option. –

+0

Je vérifiais la documentation de 'gcc' ici: [Options pour lier] (https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html) –

0

de l'homme:

-shared-libgcc
-static-libgcc
Sur les systèmes qui fournissent libgcc comme une bibliothèque partagée, ces options forcer l'utilisation soit la version partagée ou statique respectivement . Si aucune version partagée de libgcc n'a été créée lorsque le compilateur a été configuré , ces options n'ont aucun effet.

bonne chance

+5

n'est pas chapeau juste pour libgcc? il ne résout pas le problème pour les autres bibliothèques –

+0

yup, c'est ma faute. vous pouvez écrire libname.so pour lier avec lui comme dit kobac, merci pour la correction – Aboelnour