我不明白-Wl,-rpath -Wl,


244

为了方便起见,我在下面添加了相关的联机帮助页。

我的(误)理解是:如果需要用来分隔选项,,则意味着第二个-Wl不是另一个选项,因为它先,于该-rpath选项,这意味着它是该选项的参数。

我不明白怎么-rpath能有一个-Wl,.说法!

在我看来有意义的是:

-Wl,-rpath .

这应该使用当前目录参数调用-rpath链接器选项。


man gcc:

-Wl,选项

通过选项作为链接器的选项。如果option包含逗号,则会在逗号处将其拆分为多个选项。您可以使用此语法将参数传递给选项。例如,-Wl,-Map,output.map传递 -Map output.map给链接器。使用GNU链接器时,您也可以通过`-Wl,-Map = output.map'获得相同的效果。

人ld:

-rpath = dir

将目录添加到运行时库搜索路径。在将ELF可执行文件与共享库链接时使用。所有-rpath参数都被串联并传递到运行时链接程序,该链接程序使用它们在运行时定位共享对象。在查找链接中显式包含的共享库所需的共享库时,也使用-rpath选项。


2
标题末尾是否缺少点字符?
Celdor

Answers:


276

gcc-Wl,xxx选项将以逗号分隔的标记列表作为以空格分隔的参数列表传递给链接器。所以

gcc -Wl,aaa,bbb,ccc

最终成为链接器调用

ld aaa bbb ccc

在您的情况下,您想说“ ld -rpath .”,因此可以将其作为-Wl,-rpath,.替代传递给gcc ,您可以指定的重复实例-Wl

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

请注意,aaa第二个和之间没有逗号-Wl

或者,就您而言,-Wl,-rpath -Wl,.


5
哦,我现在明白了,在将内容传递给链接器时,选项或参数之间没有区别,它只是一个字符串。所以第二个-Wl是多余的!谢谢:)
Blub 2011年

29
@Blub:这不是多余的!这是另一种形式,你要么-Wl,-rpath,. 还是你说的-Wl,-rpath -Wl,.。恰好是两者之一,您不能省略任何内容。
Kerrek SB 2011年

有没有人成功在OS X上设置rpath,即使用clang和ld64?
本·阿尔布雷希特

如果要指定多个rpath,语法会是什么样?-Wl,-rpath -Wl,. -Wl,-rpath -Wl,/my/lib
Hintron,

1
@Hintron:是,或者-Wl,-rpath,dir1,-rpath,dir2,或者-Wl,-rpath=dir1,-rpath=dir2
Kerrek SB

63

你也可以写

-Wl,-rpath=.

摆脱那个讨厌的空间。可以说,它比添加额外的逗号更具可读性(这正是传递给ld的内容)。


3
gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options-Wl,option:“ 使用GNU链接器时使用 -Wl,-Map = output.map也可以得到相同的效果。” 对我来说,这似乎表明,如果您使用的不是GNU链接器,则=可能不支持该语法。
Hintron,

39

另一件事。您可能需要指定-L选项,以及 -例如,

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

否则您可能会遇到类似以下的错误

ld: cannot find -lbaz

10

手册页非常清楚。如果要将两个参数(-rpath.)传递给链接器,则可以编写

-Wl,-rpath,.

或者

-Wl,-rpath -Wl,.

-Wl,-rpath .您提出的论点在我看来是没有道理的。gcc应该如何得知您的第二个参数(.)应该传递给链接器,而不是被正常解释?它能够知道的唯一方法是,如果它对所有可能的链接器参数具有内幕知识,那么它知道-rpath在其后需要一个参数。


gcc分析参数并不是不可想象的,如果没有意义,它将自动分组。
2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.