Question

Je construis mon premier paquet géré autoconf.

Cependant, je ne peux pas trouver des exemples simples partout de la façon de spécifier une bibliothèque nécessaire, et trouver cette bibliothèque où il pourrait être dans divers endroits différents.

Je suis actuellement obtenu:

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

:

  1. Il ne trouve pas la version installée dans /opt/local/lib
  2. Il ne se plaint pas si la bibliothèque est pas réellement trouvé
  3. Je dois définir le chemin d'inclusion de trop /opt/local/include

toute aide ou des liens vers des tutoriels décents beaucoup apprécié ...

Était-ce utile?

La solution

Vous devez définir manuellement CFLAGS, et CXXFLAGS si vous voulez LDFLAGS gcc / g ++ regarder dans des endroits non standard.

Alors, avant d'appeler AC_CHECK_LIB(), faire quelque chose comme

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

Vous n'avez pas besoin CXXFLAGS si vous n'utilisez gcc au long de votre script de configuration.

Autres conseils

script autoconf ne peut pas deviner l'emplacement de la bibliothèque « en option », qui peuvent varier d'une plate-forme à l'autre. Ainsi, vous pouvez dire

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

Pour que vous devez AC_CHECK_LIB() préciser la condition ne parviennent pas explicitement dans "l'action si-faux" argument:

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

Sortie:

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

<=> ne manque pas par défaut sur des raisons évidentes: on peut vérifier plusieurs bibliothèques différentes qui offrent des fonctionnalités similaires et choisissez un d'entre eux:)

Aussi jeter un oeil à

Si les navires de la bibliothèque d'un fichier .pc, utilisez la PKG_CHECK_MODULES () macro qui fait les choses que vous voulez. Si c'est votre propre bibliothèque, juste envoyer un fichier .pc dans / usr / lib / pkgconfig, ça va le rendre beaucoup plus facile pour les autres développeurs dépendent / utiliser.

Je sais que c'est un vieux fil, mais je suppose que cela peut aider certaines personnes à. Voici comment je trouve des choses.

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

Voici comment faire:

# We need the math library for some tests.
AC_CHECK_LIB([m], [floor], [],
                  [AC_MSG_ERROR([Can't find or link to the math library.])])

Notez qu'il ne l'erreur pas automatiquement lorsque la bibliothèque ne se trouve pas, vous devez appelé AC_MSG_ERROR () comme dans le code ci-dessus.

Vous voulez autoconf de configuration pour trouver ces répertoires automatiquement et codelogic donne la réponse; mais supposons que vous ne voulez pas y chercher sur tous les systèmes, que sur un Mac. Vous pouvez ajouter ce qui suit

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

Notez que je l'ai ajouté comme un arbre de cas afin que vous puissiez ajouter des choses pour une variété de systèmes d'exploitation plus tard (comme Linux * et BSD ).

Si vous arrive d'utiliser ou GCC CLANG, la manière standard est d'avoir la variable d'environnement avec le chemin CPLUS_INCLUDE_PATH de la non-officielle inclut fichiers et LIBRARY_PATH pour les bibliothèques. Rappelez que vous n'avez pas à changer quoi que ce soit dans le configure.ac. Ainsi, vous pouvez simplement appeler la configuration de cette façon:

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

Les variables standard de fait

Variable           | lang | Usage
-------------------|------|---------
C_INCLUDE_PATH     | C    | colon separated list of include directory paths
CPLUS_INCLUDE_PATH | C++  | colon separated list of include directory paths
LIBRARY_PATH       | C/C++| colon separated compiling time static linking dirs
LD_RUN_PATH        | C/C++| colon separated compiling time dynamic linking dirs
LD_LIBRARY_PATH    | C/C++| colon separated run-time dynamic linking dirs
CPPFLAGS           | C/C++| prepocessor flags
CFLAGS             | C    | Compiling flags
CXXFLAGS           | C++  | Compiling flags
LDFLAGS            | C++  | Linking flags

NOTE Vous pouvez utiliser ou CPPFLAGS LDFLAGS, cependant, CPPFLAGS/LDFLAGS / *_PATH correspond exactement à vos besoins. Pour les drapeaux sont PATHs qui peuvent être beaucoup de choses, mais sont pour CFLAGS <=>

La portabilité Note: Bien que cela fonctionnera sur de nombreux compilateurs modernes, tous les compilateurs respecteront ces variables. Certains compilateurs croisés seront purement et simplement ignorer ou de les remplacer, ce qui oblige à une recourir à des modifications <=> et comme mentionné <=> dans d'autres réponses.

SOURCE pusse downvotes ici être à cause du manque de sources dans ma réponse. Voici pour en <=> GCC : https: //gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top