GCC中的“-Wl,option”和“-Xlinker option”语法有区别吗?

42

我一直在查阅一些配置文件,发现它们在不同的架构上都有使用(尽管不同)。如果您在Linux系统上使用GCC,那么使用这两种语法将选项传递给链接器之间是否有区别?

通过阅读GCC手册,我发现它们的解释几乎完全相同。

1个回答

49

来自于man gcc

-Xlinker选项

将选项作为链接器的一个选项进行传递。您可以使用此选项提供GCC不知道如何识别的特定于系统的链接器选项。

如果要传递需要单独参数的选项,则必须使用-Xlinker两次,一次用于选项,一次用于参数。例如,要传递-assert定义,您必须编写-Xlinker -assert -Xlinker definitions。不能编写-Xlinker“-assert definitions”,因为这会将整个字符串作为单个参数传递,这不是链接器所期望的。

当使用GNU链接器时,通常使用option=value语法将参数传递给链接器选项更方便,而不是作为单独的参数。例如,您可以指定-Xlinker -Map=output.map而不是-Xlinker -Map -Xlinker output.map。其他链接器可能不支持此语法的命令行选项。

-Wl,选项

将选项作为链接器的一个选项进行传递。如果选项包含逗号,它将在逗号处分成多个选项。您可以使用此语法来将参数传递给选项。

例如,-Wl,-Map,output.map将-Map output.map传递给链接器。当使用GNU链接器时,您也可以使用-Wl,-Map=output.map达到相同的效果。

如你所见,唯一的区别是-Wl允许你通过逗号来指定多个参数,例如-Wl,-rpath,/my/libs,而这是使用-Xlinker无法实现的;另一方面,-Xlinker可能更加自我描述。任选其一即可。此外,还应检查其他编译器(例如nvccclang)是否在语法上保持一致,如果对移植性很重要,可以选择它们中的一个。


3
您可以使用多个-Xlinker选项来获得与手册中指定相同的行为。我已经阅读了手册页面,并且从那里我相信没有任何区别。我想知道的是除了个人偏好之外,代码中是否有任何原因会同时看到两者(例如可移植性或一种方法优于另一种方法等)。 - bpw1621
3
正如我所说,其他编译器可能也支持其中一种选项,但不支持另一种选项。例如,nvcc仅接受-Xlinker。但这已经不是一个纯粹的“gcc”问题了 :-) - Kerrek SB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接