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

时间:2013-07-03 09:09:24

标签: c++ linker g++ flags linker-flags

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

  

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

-zmuldefs无法识别g++选项,-z OPTION也无法识别{{1}}选项。什么是正确的参数?有可能吗?

2 个答案:

答案 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作为替代方案。