2009-02-05 2 views
20

Я создаю свой первый управляемый пакет autoconf.Разрешение библиотеки с autoconf?

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

В настоящее время я получил:

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

но:

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

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

+0

Помогает ли это [Документация по AC \ _CHECK \ _LIB] (http://www.shlomifish.org/lecture/Autotools/slides/common_macros/AC_CHECK_LIB.html)? – leed25d

ответ

10

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

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

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

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

+0

Я полагаю, что первая строка должна быть CPPFLAGS, а не CFLAGS? – Alnitak

+0

Я имел в виду CFLAGS в первой строке, однако, если включить заголовок, CPPFLAGS также должен сделать трюк. – codelogic

+2

Я согласен с Alnitak в том смысле, что рекомендуется использовать CFLAGS/CXXFLAGS (в зависимости от компилятора C/C++, который вы собираетесь использовать) следует использовать только для аргументов компилятора (например, «-g», «-O3»). Включать следует перейти на CPPFLAGS (C Pre Processor). –

8

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

+0

My lib отправляет файл .pc. Где поставить макрос PKG_CHECK_MODULES()? Благодарю. –

12

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

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() не по умолчанию по очевидным причинам: можно проверить несколько разных библиотек, которые предоставляют аналогичную функциональность, и выбрать один из них:

Также посмотрите на this post похожие темы.

+4

Еще лучше, './configure CPPFLAGS = ...' который будет помнить переменную в следующем './config.status --recheck', например. См. Http://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Defining-Variables.html –

+0

Хороший намек, я согласен. –

2

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

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 
0

Таким образом, вы хотите настроить 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 

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

0

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

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

Портативность Примечание: Хотя это будет работать на многих современных компиляторов, не все компиляторы будут соблюдать эти переменные. Некоторые кросс-компиляторы полностью игнорируют или перезаписывают их, что заставляет прибегать к изменениям CFLAGS и LDFLAGS, как упоминалось в других ответах.

Смежные вопросы