web-dev-qa-db-fra.com

Je ne comprends pas -Wl, -rpath -Wl,

Pour plus de commodité, j'ai ajouté les pages de manuel correspondantes ci-dessous.

Ma (mauvaise) compréhension d’abord: si j’ai besoin de séparer les options avec ,, cela signifie que le second -Wl n’est pas une autre option car il vient avant ,, ce qui signifie qu’il s’agit d’un argument l'option -rpath.

Je ne comprends pas comment -rpath peut avoir un argument -Wl,.!

Ce qui aurait un sens dans mon esprit serait le suivant:

-Wl,-rpath .

Cela devrait appeler l'option -rpath linker avec l'argument du répertoire en cours.


homme gcc:

-Wl, option

Passez l'option en option à l'éditeur de liens. Si l'option contient des virgules, elle est scindée en plusieurs options. Vous pouvez utiliser cette syntaxe pour passer un argument à l'option. Par exemple, -Wl,-Map,output.map transmet -Map output.map à l'éditeur de liens. Lorsque vous utilisez l'éditeur de liens GNU, vous pouvez également obtenir le même effet avec `-Wl, -Map = output.map '.

homme ld:

-rpath = dir

Ajoutez un répertoire au chemin de recherche de la bibliothèque d'exécution. Ceci est utilisé lors de la liaison d'un exécutable ELF avec des objets partagés. Tous les arguments -rpath sont concaténés et transmis à l'éditeur de liens au moment de l'exécution, qui les utilise pour localiser les objets partagés au moment de l'exécution. L'option -rpath est également utilisée pour localiser les objets partagés nécessaires aux objets partagés explicitement inclus dans le lien.

214
Blub

L'option -Wl,xxx pour gcc transmet une liste de jetons séparés par des virgules en tant que liste d'arguments séparés par des espaces à la éditeur de liens. Alors

gcc -Wl,aaa,bbb,ccc

devient finalement un appel de l'éditeur de liens

ld aaa bbb ccc

Dans votre cas, vous voulez dire "ld -rpath .", de sorte que vous transmettez ceci à gcc en tant que -Wl,-rpath,.. Vous pouvez également spécifier des instances de répétition de -Wl:

gcc -Wl,aaa -Wl,bbb -Wl,ccc

Notez qu'il n'y a pas de virgule entre aaa et le second -Wl.

Ou, dans votre cas, -Wl,-rpath -Wl,..

247
Kerrek SB

Vous pouvez aussi écrire

-Wl,-rpath=.

Pour se débarrasser de cet espace embêtant. C'est sans doute plus lisible que d'ajouter des virgules (c'est exactement ce qui est passé à ld).

61
Mike

Une autre chose. Vous devrez peut-être spécifier l'option -L aussi - par exemple

-Wl,-rpath,/path/to/foo -L/path/to/foo -lbaz

ou vous pouvez vous retrouver avec une erreur comme

ld: cannot find -lbaz
37
vince

La page de manuel est assez claire. Si vous voulez passer deux arguments (-rpath et .) à l'éditeur de liens, vous pouvez écrire

-Wl,-rpath,.

ou bien

-Wl,-rpath -Wl,.

Les arguments -Wl,-rpath . que vous avez suggérés n’ont pas de sens pour moi. Comment gcc est-il supposé savoir que votre deuxième argument (.) est censé être passé à l'éditeur de liens au lieu d'être interprété normalement? Le seul moyen de le savoir est de savoir s'il avait une connaissance interne des tous arguments possibles de l'éditeur de liens, afin de savoir que -rpath nécessitait un argument après celui-ci.

8
David Grayson