我一直在查阅一些配置文件,发现它们在不同的架构上都有使用(尽管不同)。如果您在Linux系统上使用GCC,那么使用这两种语法将选项传递给链接器之间是否有区别?
通过阅读GCC手册,我发现它们的解释几乎完全相同。
来自于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
可能更加自我描述。任选其一即可。此外,还应检查其他编译器(例如nvcc
和clang
)是否在语法上保持一致,如果对移植性很重要,可以选择它们中的一个。
nvcc
仅接受-Xlinker
。但这已经不是一个纯粹的“gcc”问题了 :-) - Kerrek SB