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