286

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

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

我不明白怎么-rpath可能有-Wl,.争论!

在我看来,这将是有意义的:

-Wl,-rpath .

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


男人 gcc:

-Wl,选项

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

男人ld:

-rpath=目录

将目录添加到运行时库搜索路径。这在将 ELF 可执行文件与共享对象链接时使用。所有 -rpath 参数都连接起来并传递给运行时链接器,运行时链接器使用它们在运行时定位共享对象。-rpath 选项也用于定位明确包含在链接中的共享对象所需的共享对象;

4

4 回答 4

327

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

gcc -Wl,aaa,bbb,ccc

最终成为链接器调用

ld aaa bbb ccc

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

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

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

或者,在你的情况下,-Wl,-rpath -Wl,..

于 2011-07-03T10:47:33.557 回答
70

你也可以写

-Wl,-rpath=.

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

于 2013-03-27T19:21:19.887 回答
44

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

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

或者你最终可能会遇到类似的错误

ld: cannot find -lbaz
于 2012-03-08T01:46:41.897 回答
12

手册页说得很清楚。如果您想将两个参数 (-rpath.) 传递给链接器,您可以编写

-Wl,-rpath,.

或者

-Wl,-rpath -Wl,.

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

于 2011-07-03T10:47:44.163 回答