我想将内部符号的符号隐藏添加到具有基于autoconf的构建系统的现有库中。探究-fvisibility=hidden
和__attribute__ ((visibility("default")))
的本地编译器等价物的最佳方法是什么?
答案 0 :(得分:4)
我认为没有一个标准的宏,但是你可以根据需要扩展以支持其他编译器,例如: Sun编译器的__hidden
:
AC_CACHE_CHECK([for __attribute__((visibility("hidden")))],
ac_cv_hidden_visibility_attribute, [
echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1; }' > conftest.c
ac_cv_hidden_visibility_attribute=no
if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD);
then
if grep '\.hidden.*foo' conftest.s >/dev/null;
then
ac_cv_hidden_visibility_attribute=yes
fi
fi
rm -f conftest.*
])
if test $ac_cv_hidden_visibility_attribute = yes;
then
AC_DEFINE(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE, 1,
[Define if __attribute__((visibility("hidden"))) is supported.])
fi
结果config.h
:
/* Define if __attribute__((visibility("hidden"))) is supported. */
#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1
答案 1 :(得分:0)
对于-fvisibility=hidden
,我使用此autoconf-archive宏:
AX_COMPILER_FLAGS([AM_CFLAGS],[AM_LDFLAGS],[$ax_is_release],[-fvisibility=hidden])
见https://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html,
但也可以使用https://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html或http://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html。 AX_COMPILER_FLAGS还会针对警告标志执行大部分操作。对于$ax_is_release
,请参见AX_IS_RELEASE
。
对于属性我使用此检查:
AC_CACHE_CHECK([for __attribute__((visibility("default")))],
ac_cv_attribute_visibility_default, [
ac_cv_attribute_visibility_default=no
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
[[ int __attribute__ ((visibility ("default"))) foo (void) { return 1; } ]], [])],
[ac_cv_attribute_visibility_default=yes])
])
if test x$ac_cv_attribute_visibility_default = xyes;
then
AC_DEFINE(HAVE_ATTRIBUTE_VISIBILITY_DEFAULT, 1,
[Define if __attribute__((visibility("default"))) is supported.])
fi
答案 2 :(得分:-1)
您可以尝试将x <- mylist[[1]]; paste( head(x,-1) , tail(x,-1) , sep = " ")
与宏<sys/cdefs.h>