22

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

但是,我在任何地方都找不到任何简单的示例来说明如何指定所需的库,并在不同的地方找到该库。

我目前有:

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

但:

  1. 它没有找到安装的版本/opt/local/lib
  2. 如果实际上没有找到库,它不会抱怨
  3. /opt/local/include我也需要将包含路径设置为

非常感谢任何帮助或指向体面教程的链接...

4

7 回答 7

14

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()默认情况下不会因为明显的原因而失败:可以检查几个提供类似功能的不同库并选择其中一个:)

还可以查看这篇文章以了解类似的主题。

于 2010-06-10T08:48:57.850 回答
10

您需要手动设置CFLAGS,如果您希望 gcc CXXFLAGS/ LDFLAGSg++ 在非标准位置查找。

因此,在调用之前AC_CHECK_LIB(),请执行以下操作

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

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

于 2009-02-05T20:59:53.497 回答
10

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

于 2009-02-05T21:28:36.683 回答
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
于 2012-01-03T16:29:36.550 回答
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()。

于 2018-10-24T14:28:24.090 回答
-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)。

于 2014-05-18T11:58:41.857 回答
-1

如果您碰巧使用GCCor ,则标准方法是使用具有非官方包含文件和库路径CLANG的环境变量。提醒您不必更改 configure.ac 中的任何内容。所以你可以这样调用配置:CPLUS_INCLUDE_PATHLIBRARY_PATH

$ 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

消息来源:这里的反对意见可能是因为我的回答中缺乏来源。这是CPLUS_INCLUDE_PATHGCC中的:https ://gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html

于 2015-04-14T08:57:48.343 回答