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

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

我不明白-rpath怎么会有-Wl。争论。

在我看来是这样的:

-Wl,-rpath .

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


男人gcc:

- wl,选择 将选项作为选项传递给 链接器。如果option包含逗号,则它 被分成多个选项在 逗号。您可以使用此语法来 向该选项传递一个参数。为 - wl,地图,输出。通过地图 地图输出。映射到链接器。当 使用GNU链接器,你也可以得到 同样的效果 “- wl,地图= output.map”。

男人ld:

-rpath=dir

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


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

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

-Wl,-rpath,.

或者

-Wl,-rpath -Wl,.

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

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

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

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

ld: cannot find -lbaz

你也可以这样写

-Wl,-rpath=.

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