如何告诉链接器g++
允许符号的多个定义(选择第一个外观)?
-z multidefs 允许多个符号定义。默认情况下,可重定位对象(.o 文件)之间发生的多个符号定义将导致致命错误情况。此选项抑制错误条件并允许采用第一个符号定义。此选项仅在指定 -b svr4 选项时有效。
该-zmuldefs
选项未被g++
, 或识别-z OPTION
。什么是正确的参数?可能吗?
如何告诉链接器g++
允许符号的多个定义(选择第一个外观)?
-z multidefs 允许多个符号定义。默认情况下,可重定位对象(.o 文件)之间发生的多个符号定义将导致致命错误情况。此选项抑制错误条件并允许采用第一个符号定义。此选项仅在指定 -b svr4 选项时有效。
该-zmuldefs
选项未被g++
, 或识别-z OPTION
。什么是正确的参数?可能吗?
没有“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
不要将多个定义视为错误。这不再受支持。此选项已过时。
GCCld
在 linux 中用作链接器,它是binutils
GNU 创建的一部分。
似乎较新版本的ld
不支持-z muldefs
选项。您可以尝试使用--allow-multiple-definition
作为替代方案。