在autoconf中探测符号可见性扩展的最佳实践

时间:2011-05-13 04:27:32

标签: c shared-libraries portability autoconf symbols

我想将内部符号的符号隐藏添加到具有基于autoconf的构建系统的现有库中。探究-fvisibility=hidden__attribute__ ((visibility("default")))的本地编译器等价物的最佳方法是什么?

3 个答案:

答案 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.htmlhttp://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>

一起使用