如何使用 g++47 允许 -z multidefs

qui*_*uss 3 c++ linker flags g++ linker-flags

如何告诉链接器g++允许多个符号定义(选择第一个出现)?

-z multidefs 允许多个符号定义。默认情况下,可重定位对象(.o 文件)之间出现的多个符号定义将导致致命错误条件。此选项抑制错误条件并允许采用第一个符号定义。此选项仅在指定了 -b svr4 选项时有效。

-zmuldefs不能识别该选项g++,也不能识别-z OPTION。什么是正确的参数?是否可以?

Jon*_*ely 6

没有“g++ 的链接器”这样的东西,它使用您系统自己的链接器。

要将选项从 GCC 传递到链接器,您需要使用 GCC-Wl,-Xlinker选项:

-Xlinker option
通过option作为一个选项给连接器。您可以使用它来提供 GCC 不知道如何识别的特定于系统的链接器选项。
如果要传递带有单独参数的选项,则必须使用-Xlinker两次,一次用于选项,一次用于参数。例如,要通过-assert definitions,您必须编写-Xlinker -assert -Xlinker definitions. 写入不起作用-Xlinker "-assert definitions",因为这将整个字符串作为单个参数传递,这不是链接器所期望的。
使用 GNU 链接器时,使用option=value语法将参数传递给链接器选项通常比作为单独的参数更方便。例如,您可以指定-Xlinker -Map=output.map而不是-Xlinker -Map -Xlinker output.map. 对于命令行选项,其他链接器可能不支持此语法。

-Wl,option
通过option作为一个选项给连接器。如果option包含逗号,则在逗号处将其拆分为多个选项。您可以使用此语法将参数传递给选项。例如,-Wl,-Map,output.map传递-Map output.map给链接器。使用 GNU 链接器时,您也可以使用-Wl,-Map=output.map.

所以你会想要使用

-Xlinker -z -Xlinker multidefs
Run Code Online (Sandbox Code Playgroud)

或者

-Wl,-z,multidefs
Run Code Online (Sandbox Code Playgroud)

但是您引用的文档说您还必须-b svr4使用该选项,例如

-Wl,-b,svr4,-z,multidefs
Run Code Online (Sandbox Code Playgroud)

编辑:从您的评论中,我看到您使用的是 Mac OS X,它使用 darwin 链接器,其手册页显示相应的选项已过时:

-m 不要将多个定义视为错误。这不再受支持。此选项已过时。


Cat*_*Dog 5

GCCld在linux中用作链接器,它是binutilsGNU创建的一部分。

看来新版本ld不支持-z muldefs选项。您可以尝试使用--allow-multiple-definition作为替代方案。