Подтвердить что ты не робот

Разрешение библиотеки с помощью autoconf?

Я создаю свой первый управляемый пакет autoconf.

Однако я не могу найти каких-либо простых примеров, как указать нужную библиотеку, и найти эту библиотеку там, где она может быть в разных местах.

У меня есть:

AC_CHECK_LIB(['event'], ['event_init'])

а

  • Он не находит версию, установленную в /opt/local/lib
  • Он не жалуется, что библиотека фактически не найдена
  • Мне нужно также установить путь include к /opt/local/include

любая помощь, или ссылки на достойные учебники, которые высоко ценятся...

4b9b3361

Ответ 1

Вам нужно вручную установить CFLAGS, CXXFLAGS и LDFLAGS, если вы хотите, чтобы gcc/g++ выглядел в нестандартных местах.

Итак, перед вызовом AC_CHECK_LIB() сделайте что-нибудь вроде

CFLAGS="$CFLAGS -I/opt/local/include"
CXXFLAGS="$CXXFLAGS -I/opt/local/include"
LDFLAGS="$LDFLAGS -L/opt/local/lib"

Вам не нужны CXXFLAGS, если вы используете gcc только в своей конфигурации script.

Ответ 2

autoconf script не может угадать "необязательные" расположения библиотек, которые могут отличаться от одной платформы к другой. Итак, вы можете сказать

CPPFLAGS="-I/opt/local/include" LDFLAGS="-L/opt/local/lib" ./configure

Для AC_CHECK_LIB() вам нужно явно указать условие отказа в аргументе "действие-если-ложно":

dnl This is simply print "no" and continue:
AC_CHECK_LIB([m], [sqrt123])
dnl This will stop:
AC_CHECK_LIB([m], [sqrt123], [], [AC_MSG_ERROR([sqrt123 was not found in libm])])

Вывод:

checking for sqrt123 in -lm... no
checking for sqrt123 in -lm... no
configure: error: sqrt123 was not found in libm

AC_CHECK_LIB() не по умолчанию по очевидным причинам: можно проверить несколько разных библиотек, которые предоставляют аналогичную функциональность, и выбрать один из них:)

Также посмотрите этот пост для аналогичной темы.

Ответ 3

Если библиотека отправляет файл .pc, рассмотрите возможность использования макроса PKG_CHECK_MODULES(), который делает то, что вы хотите. Если это ваша собственная библиотека, просто отправьте файл .pc в /usr/lib/pkgconfig, это облегчит для других разработчиков зависимость/использование.

Ответ 4

Я знаю, что сейчас это старый поток, но я думаю, это может помочь некоторым людям. Вот как я нахожу кое-что.

hdff="no"
hdffprefix="ERROR"
AC_ARG_WITH(hdf,[  --with-hdf              Compile with hdf library, for output.],[hdffprefix=$withval hdff="yes"],[])
# if there is no value given, it appears tha hdffprefix is set to "yes"
if test $hdffprefix = "yes" -a $hdff = "yes"
then
    echo "HDF: Attempting to find HDF"
    hdffprefix="ERROR"

    # check if hdffprefix is set, if it is not, it sets it to "ERROR" and the 
    # 'if' comparison evaluates to true
    if [[ "$hdffprefix" == "ERROR" ]]
    then
        echo "HDF: hdffprefix not set, searching PATH"
        for i in `echo $PATH | tr ':' '\n'`
        do
            if [[ $i == *hdf* ]]
            then
                if [[ $i == *bin/* ]]
                then
                    hdffprefix=${i%bin/}
                    # if it doesn't exist, re-set to ERROR
                    if [[ ! -f ${hdffprefix}include/hdf.h ]]
                    then
                    hdffprefix="ERROR"
                    fi
                elif [[ $i == *bin* ]]
                then
                    hdffprefix=${i%bin}
                    # if it doesn't exist, re-set to ERROR
                    if [[ ! -f ${hdffprefix}include/hdf.h ]]
                    then
                    hdffprefix="ERROR"
                    fi
                fi
            fi
        done
        if [[ "$hdffprefix" == "ERROR" ]]
        then
            echo "HDF: hdffprefix not found in PATH, trying 'which'"
            WHICH_TEST_HDF=`which hdf2gif`
            if [[ WHICH_TEST_HDF != "" ]]
            then
                hdffprefix=${WHICH_TEST_HDF%bin/hdf2gif}
            else
                echo "HDF: Warning - hdf not found"
            fi
        fi
    fi
    if [[ "$hdffprefix" != "ERROR" ]]
    then
        hdff="yes"
        echo "HDF found: $hdffprefix"
    fi
fi
if test $hdff = 'yes'; then
        hdfincs=" -DUSE_HDF -I"${hdffprefix}"include"
        scriptotherlibsinc=${scriptotherlibsinc}" -L"${hdffprefix}"/lib"
        scriptotherlibs=${scriptotherlibs}" -lmfhdf -ldf -ljpeg -lz"
    AC_CHECK_HEADERS([${hdffprefix}/include/hdf.h],,[AC_MSG_ERROR([Cannot find hdf.h])])
    AC_CHECK_HEADERS([${hdffprefix}/include/mfhdf.h],,[AC_MSG_ERROR([Cannot find mfhdf.h])])
fi

Ответ 5

Итак, вы хотите настроить autoconf, чтобы автоматически найти эти каталоги, а кодовое слово дает ответ; но предположим, что вы не хотите искать там всю систему, только на Mac. Вы можете добавить следующие

AC_CANONICAL_HOST
case $host_os in
    darwin* )
        CFLAGS="$CFLAGS -I/opt/local/include"
        CXXFLAGS="$CXXFLAGS -I/opt/local/include"
        LDFLAGS="$LDFLAGS -L/opt/local/lib"
        ;;

esac

Обратите внимание, что я добавил его как дерево case, чтобы вы могли добавлять вещи для различных операционных систем позже (например, linux * и BSD).

Ответ 6

В этой ситуации стандартным способом является переменная среды CPLUS_INCLUDE_PATH, а путь для неофициальных включает файлы и LIBRARY_PATH для библиотек. Напомним, что вам не нужно ничего менять в файле configure.ac. Поэтому вы можете просто вызвать configure следующим образом:

$ export CPLUS_INCLUDE_PATH=/opt/local/include
$ export LIBRARY_PATH=/opt/local/lib
$ ./configure