为方便起见,我在下面添加了相关联机帮助页.
首先我的(错误)理解:如果我需要将选项分开,
,这意味着第二个-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,.
.
小智 61
你也可以写
-Wl,-rpath=.
Run Code Online (Sandbox Code Playgroud)
摆脱那个讨厌的空间.它可以说比添加额外的逗号更具可读性(它正是传递给ld的内容).
小智 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)
手册页非常清楚.如果要将两个参数(-rpath
和.
)传递给链接器,则可以编写
-Wl,-rpath,.
Run Code Online (Sandbox Code Playgroud)
或者
-Wl,-rpath -Wl,.
Run Code Online (Sandbox Code Playgroud)
-Wl,-rpath .
你建议的论点对我的想法没有意义.gcc如何知道你的第二个参数(.
)应该传递给链接器而不是正常解释?它能够知道的唯一方法是它是否具有所有可能的链接器参数的内部知识,因此它知道-rpath
在它之后需要一个参数.