如何告诉g++
的链接器允许多个符号定义(选择第一个外观)?
-z multidefs允许多个符号定义。默认情况下,可重定位目标文件(.o文件)之间出现多个符号定义 将导致致命的错误情况。此选项会抑制 错误条件并允许采用第一个符号定义。 仅当指定了-b svr4选项时,此选项才有效。
-zmuldefs
无法识别g++
选项,-z OPTION
也无法识别{{1}}选项。什么是正确的参数?有可能吗?
答案 0 :(得分:3)
没有“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
或
-Wl,-z,multidefs
但是您引用的文档说您还必须使用-b svr4
来使用该选项,例如
-Wl,-b,svr4,-z,multidefs
编辑:根据您的评论,我发现您使用的是使用darwin链接器的Mac OS X,其man page显示相应的选项已过时:
-m
不要将多个定义视为错误。这不再受支持。此选项已过时。
答案 1 :(得分:1)
GCC在linux中使用ld
作为链接器,这是GNU创建的binutils
的一部分。
似乎较新版本的ld
不支持-z muldefs
选项。您可以尝试使用--allow-multiple-definition
作为替代方案。