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

Blu*_*lub 226 gcc rpath ld

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

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

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

在我看来有意义的是:

-Wl,-rpath .
Run Code Online (Sandbox Code Playgroud)

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


男人gcc:

轮候册,选项

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

男子ld:

-rpath = DIR

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

Ker*_* SB 257

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

gcc -Wl,aaa,bbb,ccc
Run Code Online (Sandbox Code Playgroud)

最终成为一个链接器调用

ld aaa bbb ccc
Run Code Online (Sandbox Code Playgroud)

在你的情况下,你想说" ld -rpath .",所以你把它传递给gcc作为-Wl,-rpath,.替代,你可以指定重复实例-Wl:

gcc -Wl,aaa -Wl,bbb -Wl,ccc
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Blub:这不是多余的!它是一种替代形式,你**说`-Wl,-rpath,.`*或*你说`-Wl,-rpath -Wl,.`.准确地说,两者之一,你不能省略任何东西. (27认同)
  • 哦,我现在理解,在将内容传递给链接器时,选项或参数之间没有区别,它只是一个字符串.所以第二个-Wl是多余的!谢谢 :) (5认同)
  • @Hintron:是的,或者`-Wl,-rpath,dir1,-rpath,dir2`,或者`-Wl,-rpath = dir1,-rpath = dir2`。 (2认同)
  • 以防万一其他人浪费几分钟来弄清楚这一点 - 就像我刚才所做的那样 - `-W` 之后的字符是小写的“L”,而不是数字“one”!哎哟! (2认同)

小智 61

你也可以写

-Wl,-rpath=.
Run Code Online (Sandbox Code Playgroud)

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

  • 在https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options中-Wl,option`下:“ _使用GNU链接器_时,您还可以使用-Wl获得相同的效果, -Map = output.map。” 对我来说,这似乎表明,如果您使用的不是GNU链接器,则可能不支持`=`语法。 (2认同)

小智 38

另一件事.您可能需要指定-L选项,以及 -例如,

-Wl,-rpath,/path/to/foo -L/path/to/foo -lbaz
Run Code Online (Sandbox Code Playgroud)

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

ld: cannot find -lbaz
Run Code Online (Sandbox Code Playgroud)


Dav*_*son 9

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

-Wl,-rpath,.
Run Code Online (Sandbox Code Playgroud)

或者

-Wl,-rpath -Wl,.
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上,它是 (11认同)