【问题标题】:What does "Duplicate symbol: __fe_def_env" mean?“重复符号:__fe_def_env”是什么意思?
【发布时间】:2016-10-25 18:42:36
【问题描述】:

在 AIX 上使用 xlc 构建共享库时,您会看到以下链接器警告:

ld: 0711-224 WARNING: Duplicate symbol: __fe_def_env

要重现,请使用此源文件fenvtest.c

#include <fenv.h>

void exported_func() {
  fenv_t f;
  (void)fegetenv(&f);
}

然后运行以下命令:

$ xlc -G -o fenvtest.so -lm -Wl,-bexpfull fenvtest.c
ld: 0711-224 WARNING: Duplicate symbol: __fe_def_env
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.

【问题讨论】:

    标签: linker shared-libraries linker-errors aix xlc


    【解决方案1】:

    通常在构建共享库并使用链接器选项-bexpfull 时会出现有关__fe_def_env 的警告。 See the linker documentation for more explanation of -bexpfull.

    符号__fe_def_env/usr/include/fenv.h中定义:

    const fenv_t __fe_def_env = { FE_TONEAREST, 0, 0, 0, 0 };
    

    所以它包含在每个包含fenv.h 的对象中。因此,如果使用-bexpfull 或导出__fe_def_env 的其他选项构建共享对象时,此符号将与其他文件中的同名符号发生冲突。

    您可以通过以下方式避免警告:

    • 使用-bexpall 代替-bexpfull
    • 自定义导出列表以排除__fe_def_env

    也就是说,警告是无害的,可以忽略。

    【讨论】:

    • 您可以将fenv.h 编辑为extern const fenv_t __fe_def_env。 __fe_def_env 定义在libm
    猜你喜欢
    • 2016-10-13
    • 2020-06-29
    • 1970-01-01
    • 2015-02-13
    • 2020-06-05
    • 2012-05-28
    • 2011-04-07
    • 2014-05-11
    • 1970-01-01
    相关资源
    最近更新 更多