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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我不明白-Wl,-rpath -Wl,相关的知识,希望对你有一定的参考价值。

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

首先我的(误)理解:如果我需要将选项与,分开,这意味着第二个-Wl不是另一种选择,因为它来自,,这意味着它是-rpath选项的参数。

我不明白-rpath怎么会有-Wl,.论点!

在我看来有意义的是:

-Wl,-rpath .

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


男人gcc:

-Wl,选项

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

男子ld:

-rpath = dir

将目录添加到运行时库搜索路径。将ELF可执行文件与共享对象链接时使用此方法。所有-rpath参数都连接在一起并传递给运行时链接程序,后者使用它们在运行时查找共享对象。在定位链接中明确包含的共享对象所需的共享对象时,也会使用-rpath选项;

答案

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

另一答案

你也可以写

-Wl,-rpath=.

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

另一答案

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

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

或者你最终会得到一个错误

ld: cannot find -lbaz
另一答案

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

-Wl,-rpath,.

或者

-Wl,-rpath -Wl,.

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

以上是关于我不明白-Wl,-rpath -Wl,的主要内容,如果未能解决你的问题,请参考以下文章

patchelf修改rpath

-L???-rpath???-rpath-link?????????

GCC 中 -L-rpath和-rpath-link的区别

编译修改OpenCV的rpath

RPATH与RUNPATH

MAC:使用install_name_rpath修改编译结果的rpath