使用autoconf的库解析?

时间:2009-02-05 19:40:33

标签: autoconf

我正在构建我的第一个autoconf托管包。

但是我找不到任何关于如何指定所需库的简单示例,并找到它可能位于不同位置的库。

我现在有:

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

但:

  1. 找不到/opt/local/lib
  2. 中安装的版本
  3. 如果实际上找不到图书馆,则不会抱怨
  4. 我需要将包含路径设置为/opt/local/include
  5. 任何帮助,或赞赏体面教程的链接... ...

7 个答案:

答案 0 :(得分:13)

autoconf脚本无法猜测“可选”库位置,这可能因平台而异。所以你可以说

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

对于AC_CHECK_LIB(),您需要在“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])])

输出:

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类似主题。

答案 1 :(得分:10)

如果您希望gcc / g ++查看非标准位置,则需要手动设置CFLAGSCXXFLAGSLDFLAGS

因此,在致电AC_CHECK_LIB()之前,请执行

之类的操作
CFLAGS="$CFLAGS -I/opt/local/include"
CXXFLAGS="$CXXFLAGS -I/opt/local/include"
LDFLAGS="$LDFLAGS -L/opt/local/lib"

如果您只在整个配置脚本中使用gcc,则不需要CXXFLAGS。

答案 2 :(得分:10)

如果库附带.pc文件,请考虑使用PKG_CHECK_MODULES()宏来执行您想要的操作。如果它是您自己的库,只需将.pc文件发送到/ usr / lib / pkgconfig,它将使其他开发人员更容易依赖/使用它。

答案 3 :(得分:1)

我知道这是一个旧线程,但我想这可能会帮助一些人。这就是我找到一些东西的方式。

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

答案 4 :(得分:1)

方法如下:

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

请注意,当找不到库时,它不会自动出错,您必须像上面的代码中那样调用AC_MSG_ERROR()。

答案 5 :(得分:-1)

所以你想设置autoconf自动找到这些目录,codelogic给出答案;但是假设你不想在所有系统上搜索,只能在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 )。

答案 6 :(得分:-1)

如果您正好使用GCCCLANG,标准方法是使用非官方包含CPLUS_INCLUDE_PATH >库的文件和LIBRARY_PATH。提醒您不必更改configure.ac中的任何内容。所以你可以用这种方式调用configure:

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

事实标准变量

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

注意您可以使用CPPFLAGSLDFLAGS,但CPLUS_INCLUDE_PATH / LIBRARY_PATH完全符合您的要求。 CPPFLAGS/LDFLAGS用于标记可以包含许多内容但*_PATH适用于PATHs

可移植性注意:虽然这适用于许多现代编译器,但并非所有编译器都会尊重这些变量。一些交叉编译器将直接忽略或覆盖它们,这迫使人们采用其他答案中提到的CFLAGSLDFLAGS修改。

消息来源这可能是因为我的回答缺乏消息来源。此处适用于 GCC 中的CPLUS_INCLUDE_PATHhttps://gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html