"Duplicate symbol: __fe_def_env" 是什么意思?
What does "Duplicate symbol: __fe_def_env" mean?
在 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.
通常在构建共享库和使用链接器选项-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
也就是说,警告是无害的,可以忽略。
在 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.
通常在构建共享库和使用链接器选项-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
也就是说,警告是无害的,可以忽略。