我正在构建我的第一个 autoconf 托管包。
但是,我在任何地方都找不到任何简单的示例来说明如何指定所需的库,并在不同的地方找到该库。
我目前有:
AC_CHECK_LIB(['event'], ['event_init'])
但:
- 它没有找到安装的版本
/opt/local/lib
- 如果实际上没有找到库,它不会抱怨
/opt/local/include
我也需要将包含路径设置为
非常感谢任何帮助或指向体面教程的链接...
我正在构建我的第一个 autoconf 托管包。
但是,我在任何地方都找不到任何简单的示例来说明如何指定所需的库,并在不同的地方找到该库。
我目前有:
AC_CHECK_LIB(['event'], ['event_init'])
但:
/opt/local/lib
/opt/local/include
我也需要将包含路径设置为非常感谢任何帮助或指向体面教程的链接...
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()
默认情况下不会因为明显的原因而失败:可以检查几个提供类似功能的不同库并选择其中一个:)
还可以查看这篇文章以了解类似的主题。
您需要手动设置CFLAGS
,如果您希望 gcc CXXFLAGS
/ LDFLAGS
g++ 在非标准位置查找。
因此,在调用之前AC_CHECK_LIB()
,请执行以下操作
CFLAGS="$CFLAGS -I/opt/local/include"
CXXFLAGS="$CXXFLAGS -I/opt/local/include"
LDFLAGS="$LDFLAGS -L/opt/local/lib"
如果您只在整个配置脚本中使用 gcc,则不需要 CXXFLAGS。
如果库附带一个 .pc 文件,请考虑使用 PKG_CHECK_MODULES() 宏来执行您想要的操作。如果它是您自己的库,只需将 .pc 文件发送到 /usr/lib/pkgconfig,它将使其他开发人员更容易依赖/使用它。
我知道这是一个旧线程,但我想这可能会帮助一些人。这就是我找到一些东西的方式。
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
这是如何做到的:
# 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()。
所以你想设置 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)。
如果您碰巧使用GCC
or ,则标准方法是使用具有非官方包含文件和库路径CLANG
的环境变量。提醒您不必更改 configure.ac 中的任何内容。所以你可以这样调用配置:CPLUS_INCLUDE_PATH
LIBRARY_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
注意您可以使用CPPFLAGS
或LDFLAGS
,但是CPLUS_INCLUDE_PATH
/LIBRARY_PATH
完全符合您的要求。CPPFLAGS/LDFLAGS
适用于可以是很多东西但*_PATH
适用于的标志PATHs
可移植性注意:虽然这适用于许多现代编译器,但并非所有编译器都会尊重这些变量。一些交叉编译器会完全忽略或覆盖它们,这会迫使人们求助于其他答案中提到的修改CFLAGS
。LDFLAGS
消息来源:这里的反对意见可能是因为我的回答中缺乏来源。这是CPLUS_INCLUDE_PATH
在GCC中的:https ://gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html