为方便起见,我在下面添加了相关联机帮助页。
首先理解我的(错误):如果我需要将选项与,
分开,则意味着第二个-Wl
不是另一个选项,因为它出现在,
之前,这意味着它是-rpath
-rpath
选项的参数。
我不明白-Wl,.
如何有-Wl,-rpath .
参数!
在我看来有意义的是:
-Wl,-Map,output.map
这应该使用当前目录参数调用-rpath链接器选项。
man gcc:
-Wl,选项
传递选项作为选项 连接。如果选项包含逗号,则为 分为多个选项 逗号。您可以使用此语法 将参数传递给选项。对于 例如,
-Map output.map
通过 {{1}}到链接器。什么时候 使用GNU链接器,您也可以获得 同样的效果 `-Wl,-Map = output.map”。
man ld:
-rpath = dir
添加目录到 运行时库搜索路径。这是 链接ELF可执行文件时使用 与共享对象。全部是-rpath 参数被连接并传递 到运行时链接器,它使用它们 在运行时定位共享对象。 -rpath选项也用于 找到共享对象 明确需要共享对象 包含在链接中;
答案 0 :(得分:241)
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,.
。
答案 1 :(得分:59)
你也可以写
-Wl,-rpath=.
摆脱那个讨厌的空间。它可以说比添加额外的逗号更具可读性(它正是传递给ld的内容)。
答案 2 :(得分:34)
另一件事。您可能还需要指定-L选项以及 - 例如
-Wl,-rpath,/path/to/foo -L/path/to/foo -lbaz
或者您可能会遇到像
这样的错误ld: cannot find -lbaz
答案 3 :(得分:8)
手册页非常清楚。如果要将两个参数(-rpath
和.
)传递给链接器,可以编写
-Wl,-rpath,.
或者
-Wl,-rpath -Wl,.
你建议的论据-Wl,-rpath .
对我的想法没有意义。 gcc应该知道你的第二个参数(.
)应该传递给链接器而不是正常解释?它能够知道的唯一方法是,它是否具有所有可能的链接器参数的内幕知识,因此它知道-rpath
之后需要一个参数。