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

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

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

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

在我脑海中,有什么是有道理的:

 -Wl,-rpath . 

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


man gcc:

轮候册,选项

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

男人ld:

-rpath = DIR

将目录添加到运行时库searchpath。 链接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 

或者,在你的情况下, -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 . 你build议我没有意义。 gcc应该如何知道你的第二个参数( . )应该被传递给链接器,而不是被正常解释? 能够知道的唯一方法是知道所有可能的链接器参数的内幕知识,所以它知道-rpath需要一个参数。