Использование LDFLAGS в автоинструментах с libtool

В зависимости от ОС я определяю специальный LDFLAGS в моем файле configure.ac:

AC_CANONICAL_HOST
if test "$host_os" = cygwin
then
    LDFLAGS="$LDFLAGS -Wl,-no-undefined"
    export LDFLAGS
fi
AC_SUBST([LDFLAGS])

Пакет использует AC_PROG_LIBTOOL, и когда LDFLAGS передается в libtool, префикс -Wl остается, и компоновщик не понимает этот параметр. Если я удалю этот префикс, макрос AC_PROG_CXX завершится ошибкой, потому что GCC сам подавится -no-undefined. Что я делаю неправильно?

LDFLAGS не упоминается в Makefile.am, но я убедился, что он соблюдается в команде libtool, запустив make -n.

Я использую autoconf 2.69, automake 1.14, gmake 4.0 и gcc 4.8.2 под Cygwin 1.7.28(0.271/5/3)

Редактировать: у меня есть несколько десятков Makefile.am, более половины из которых из внешних библиотек — я бы предпочел управлять этими флагами из центрального места.


person Irfy    schedule 17.02.2014    source источник
comment
Вероятно, это должно быть -Wl,--no-undefined (примечание 2 -s), а не -Wl,-no-undefined.   -  person ldav1s    schedule 18.02.2014


Ответы (2)


В Libtool есть опция -no-undefined.

GNU ld имеет параметр --no-undefined.

Вы должны сообщить об этом libtool из Makefile.am и позволить ему позаботиться о пересылке компоновщику:

configure.ac

AC_CANONICAL_HOST
if test "$host_os" = cygwin
then
    EXTRA_LDFLAGS="-no-undefined"
fi
AC_SUBST([EXTRA_LDFLAGS])

Makefile.am

AM_LDFLAGS = $(EXTRA_LDFLAGS) ...

Как правило, вам не следует возиться с CPPFLAGS, LDFLAGS и т. д. из configure.ac, поскольку пользователю может потребоваться изменить их при вызове «make».

person DanielKO    schedule 18.02.2014
comment
Это правильно — оставьте переменные среды, которые выбирает configure, в покое. - person Brett Hale; 18.02.2014
comment
У меня есть несколько десятков Makefile.am, которые соответствуют регулярному выражению ^lib (т.е. определяют переменные libXXX). Я все же предпочел бы воздействовать на все эти make-файлы централизованно, если это возможно, чем изменять каждый отдельный файл Makefile.am. Будет что-то вроде AC_SUBST([AM_LDFLAGS], "--no-undefined") work? None of those Makefile.ams explicitly set AM_LDFLAGS`... - person Irfy; 18.02.2014

Чтобы не изменять десятки Makefile, я использовал LDFLAGS. Хитрость заключалась в том, чтобы установить его после макроса AC_PROG_CXX:

AC_PROG_CXX
if test "$host_os" = cygwin
then
    LDFLAGS="-no-undefined $LDFLAGS"
fi
AC_SUBST([LDFLAGS])

Таким образом, макрос, проверяющий наличие компилятора C++, завершается успешно, потому что LDFLAGS является нетронутым; но фактическая кодовая база использует дополнительный флаг.

При добавлении замены $LDFLAGS в конце любые пользовательские параметры из среды имеют приоритет во время настройки; и переопределение во время создания с помощью make LDFLAGS=... все еще возможно.

person Irfy    schedule 24.02.2014
comment
Технически это хаки, поскольку зависимости и порядок этих переменных не документированы. На практике автоинструменты предназначены для выполнения работы. Это элегантно и полезно знать! - person Brett Hale; 26.02.2014