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

为了方便起见,我在下面添加了相关的手册页。

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

我不明白-rpath怎么能有-Wl,.参数!

在我看来是这样的:

-Wl,-rpath .

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


男人gcc:

- wl,选择

将选项作为选项传递给 链接器。如果option包含逗号,则它 被分成多个选项在 逗号。您可以使用此语法来 向该选项传递一个参数。为 例如,-Wl,-Map,output.map传递 -Map output.map到链接器。当 使用GNU链接器,你也可以得到 同样的效果 “- wl,地图= output.map '。< / p >

男人ld:

rpath = dir

添加目录到 运行时库搜索路径。这是 在链接ELF可执行文件时使用 共享对象。所有的rpath 参数被连接并传递 到使用它们的运行时链接器 在运行时定位共享对象。 -rpath选项也用于 定位共享对象 共享对象显式需要

.包含在链接中
240850 次浏览

海湾合作委员会-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,.

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

-Wl,-rpath,.

或者

-Wl,-rpath -Wl,.

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

还有一件事。你可能需要指定- l选项 - eg

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

或者你可能会得到这样的错误

ld: cannot find -lbaz

你也可以这样写

-Wl,-rpath=.

把那烦人的地方清理掉。可以说,它比添加额外的逗号更具可读性(这正是传递给ld的内容)。