我正在构建我的第一个autoconf托管包。
但是我找不到任何关于如何指定所需库的简单示例,并找到它可能位于不同位置的库。
我现在有:
AC_CHECK_LIB(['event'], ['event_init'])
但:
/opt/local/lib
/opt/local/include
任何帮助,或赞赏体面教程的链接... ...
答案 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 ++查看非标准位置,则需要手动设置CFLAGS
,CXXFLAGS
和LDFLAGS
。
因此,在致电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)
如果您正好使用GCC
或CLANG
,标准方法是使用非官方包含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
注意您可以使用CPPFLAGS
或LDFLAGS
,但CPLUS_INCLUDE_PATH
/ LIBRARY_PATH
完全符合您的要求。 CPPFLAGS/LDFLAGS
用于标记可以包含许多内容但*_PATH
适用于PATHs
可移植性注意:虽然这适用于许多现代编译器,但并非所有编译器都会尊重这些变量。一些交叉编译器将直接忽略或覆盖它们,这迫使人们采用其他答案中提到的CFLAGS
和LDFLAGS
修改。
消息来源这可能是因为我的回答缺乏消息来源。此处适用于 GCC 中的CPLUS_INCLUDE_PATH
:https://gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html