3

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

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

-zmuldefs选项未被g++, 或识别-z OPTION。什么是正确的参数?可能吗?

4

2 回答 2

6

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

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

-Xlinker option
option作为选项传递给链接器 。您可以使用它来提供 GCC 不知道如何识别的特定于系统的链接器选项。
如果要传递带有单独参数的选项,则必须使用-Xlinker两次,一次用于选项,一次用于参数。例如,要通过-assert definitions,您必须编写-Xlinker -assert -Xlinker definitions。write 不起作用-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

或者

-Wl,-z,multidefs

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

-Wl,-b,svr4,-z,multidefs

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

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

于 2013-07-03T10:38:18.893 回答
3

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

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

于 2017-08-25T16:02:46.243 回答