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

时间:2011-07-03 10:41:48

标签: gcc ld rpath

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

首先理解我的(错误):如果我需要将选项与,分开,则意味着第二个-Wl不是另一个选项,因为它出现在,之前,这意味着它是-rpath -rpath选项的参数。

我不明白-Wl,.如何有-Wl,-rpath . 参数!

在我看来有意义的是:

-Wl,-Map,output.map

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


man gcc:

  

-Wl,选项

     

传递选项作为选项   连接。如果选项包含逗号,则为   分为多个选项   逗号。您可以使用此语法   将参数传递给选项。对于   例如,-Map output.map通过   {{1}}到链接器。什么时候   使用GNU链接器,您也可以获得   同样的效果   `-Wl,-Map = output.map”。

man ld:

  

-rpath = dir

     

添加目录到   运行时库搜索路径。这是   链接ELF可执行文件时使用   与共享对象。全部是-rpath   参数被连接并传递   到运行时链接器,它使用它们   在运行时定位共享对象。   -rpath选项也用于   找到共享对象   明确需要共享对象   包含在链接中;

4 个答案:

答案 0 :(得分:241)

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

答案 1 :(得分:59)

你也可以写

-Wl,-rpath=.

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

答案 2 :(得分:34)

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

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

或者您可能会遇到像

这样的错误
ld: cannot find -lbaz

答案 3 :(得分:8)

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

-Wl,-rpath,.

或者

-Wl,-rpath -Wl,.

你建议的论据-Wl,-rpath .对我的想法没有意义。 gcc应该知道你的第二个参数(.)应该传递给链接器而不是正常解释?它能够知道的唯一方法是,它是否具有所有可能的链接器参数的内幕知识,因此它知道-rpath之后需要一个参数。