Я хотел бы добавить скрытие символов для внутренних символов в существующую библиотеку с системой сборки на основе autoconf. Как лучше всего найти эквивалент локального компилятора для -fvisibility=hidden
и __attribute__ ((visibility("default")))
?
Рекомендации по поиску расширений видимости символов в autoconf
Ответы (3)
Я не думаю, что для этого существует стандартный макрос, но вот что-то, что вы должны иметь возможность расширить для поддержки других компиляторов по мере необходимости, например. __hidden
для компиляторов Sun:
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
Для -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
HAVE_ATTRIBUTE_VISIBILITY_DEFAULT
на Cygwin и MinGW?
- person yugr; 02.06.2018
-Werror
.
- person nwellnhof; 26.06.2020
Вы можете попробовать использовать <sys/cdefs.h>
с макросом __hiden
__hidden
, по крайней мере, в Ubuntu 16.04. И я не смог найти его в исходном коде Glibc.
- person yugr; 14.05.2018