Rozdzielczość biblioteki z autoconf?

Buduję swój pierwszy pakiet autoconf managed.

Jednak nie mogę znaleźć żadnych prostych przykładów, jak określić wymaganą bibliotekę i znaleźć tę bibliotekę, gdzie może być w różnych miejscach.

Aktualnie mam:

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

Ale:

  1. nie znajduje wersji zainstalowanej w /opt/local/lib
  2. nie skarży się, jeśli biblioteka nie zostanie znaleziona
  3. muszę też ustawić ścieżkę include na /opt/local/include

Każda pomoc, lub linki do przyzwoitych samouczków bardzo cenione...

 20
Author: Alnitak, 2009-02-05

6 answers

Musisz ręcznie ustawić CFLAGS, CXXFLAGS i LDFLAGS Jeśli chcesz, aby gcc / g++ szukał w niestandardowych lokalizacjach.

Więc, zanim zadzwonisz AC_CHECK_LIB(), Zrób coś w rodzaju

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

Nie potrzebujesz CXXFLAGS, jeśli używasz tylko gcc w całym skrypcie configure.

 10
Author: codelogic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-05 20:59:53

Skrypt Autoconf nie może odgadnąć "opcjonalnych" lokalizacji bibliotek, które mogą się różnić w zależności od platformy. Więc możesz powiedzieć

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

Dla AC_CHECK_LIB() Musisz podać warunek fail jawnie w argumencie "action-if-false":

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])])

Wyjście:

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

AC_CHECK_LIB() domyślnie nie zawodzi z oczywistych powodów: można sprawdzić kilka różnych bibliotek, które zapewniają podobną funkcjonalność i wybrać jedną z nich:) {]}

Zobacz też ten post dla podobny temat.

 13
Author: dma_k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:00

Jeśli Biblioteka wysyła a .plik pc, rozważ użycie makra PKG_CHECK_MODULES (), które robi to, co chcesz. Jeśli to twoja własna biblioteka, po prostu wyślij .plik pc do /usr / lib / pkgconfig, znacznie ułatwi innym programistom zależenie/używanie go.

 8
Author: Johan Dahlin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-05 21:28:36

Wiem, że to już stary wątek, ale to może niektórym pomóc. W ten sposób znajduję pewne rzeczy.

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
 1
Author: NAH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-03 16:29:36

Więc chcesz skonfigurować autoconf, aby znaleźć te katalogi automatycznie i codelogic daje odpowiedź; ale załóżmy, że nie chcesz szukać tam na wszystkich systemach, tylko na komputerze mac. Możesz dodać następujące

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

Zauważ, że dodałem go jako drzewo przypadków, abyś mógł później dodawać rzeczy dla różnych systemów operacyjnych( takich jak linux * i BSD ).

 0
Author: Michael Conlen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-18 11:58:41

W tej sytuacji standardowym sposobem jest posiadanie zmiennej środowiskowej CPLUS_INCLUDE_PATHze ścieżką nieoficjalnych zawiera pliki i LIBRARY_PATH dla bibliotek. Przypomnij, że nie musisz niczego zmieniać w configure.ac. więc możesz po prostu wywołać konfigurację w ten sposób:

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

Uwaga dotycząca przenośności: chociaż będzie to działać na wielu współczesnych kompilatorach, nie wszystkie Kompilatory będą respektować te zmienne. Niektóre Kompilatory krzyżowe będą je ignorować lub nadpisywać, co zmusza do uciekania się do modyfikacji CFLAGS i LDFLAGS, Jak wspomniano w innych odpowiedziach.

 0
Author: Vicente Adolfo Bolea Sánchez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-24 01:13:40