我刚刚开始使用autotools,并密切关注A. Duret-Lutz的教程,以获得一个使用GNU gettext的C hello世界。
AM_CFLAGS和AM_LDFLAGS在Makefile.am中正确设置,代码编译并成功运行。
问题是autoconf没有搜索AM_CFLAGS和AM_LDFLAGS告诉编译器搜索的目录,因此没有在config.h中定义HAVE_GETTEXT_H,HAVE_LIBINTL等宏。
如何使用configure.ac来补充库并包含它在使用AC_CHECK_LIB和AC_CHECK_HEADERS时搜索的目录?
答案 0 :(得分:2)
我想我误解了原来的问题,但由于我的其他答案中没有任何内容本身不正确,我会添加另一个答案。
要在AC_CHECK_HEADER
和AC_CHECK_LIBS
中使用自定义路径,必须(暂时)相应地设置CFLAGS
和LDFLAGS
:
CFLAGS_backup="${CFLAGS}"
LDFLAGS_backup="${LDFLAGS}"
CFLAGS="-I/path/to/an/additional/include/ ${CFLAGS}"
LDFLAGS="-L/path/to/the/lib/ ${LDFLAGS}"
AC_CHECK_HEADER(...)
AC_CHECK_LIB(...)
## reset CFLAGS and LDFLAGS
CFLAGS="${CFLAGS_backup}"
LDFLAGS="${LDFLAGS_backup}"
在AC_CHECK_*
范围内,您通常会将GETTEXT_CFLAGS
或LIBINTL_LIBS
设置为变量并将其导出,以分别用于每个AC_SUBST([GETTEXT_CFLAGS])
和AC_SUBST([LIBINTL_LIBS])
的automake。
很遗憾,您无法在configure.ac中访问AM_CFLAGS
或AM_LDFLAGS
。
现在在Makefile.am
,你可以使用
AM_CFLAGS = $(GETTEXT_CFLAGS) <other stuff>
AM_LDFLAGS = $(GETTEXT_LIBS) <other stuff>
为方便起见,您通常也会通过AC_ARG_WITH
或AC_ARG_VAR
向用户公开参数,以便他们可以使用--with-gettext
或{{1} }以及configure命令。
看到autoconf真的只有m4,你可以自己将上面的内容包装起来。当我们在这里讨论gettext时,已经有了这样的事情:LIBINTL_LIBS=...
,你可以在调用AM_GNU_GETTEXT
之后在configure.ac中使用的m4宏。
答案 1 :(得分:1)
而不是AC_CHECK_HEADER
,使用AC_CHECK_HEADERS
来定义HAVE_<HEADER>_H
形式的令牌。单数形式希望您使用ACTION-IF-FOUND
(第二个参数)自己定义。
对于AC_CHECK_LIB
,没有这样的安慰,你必须使用ACTION-IF-FOUND
(第三个参数)和AC_DEFINE
所需的一切。
此外,还会设置shell变量ac_cv_header_<HEADER>_h
和ac_cv_lib_<LIBRARY>_<FUNCTION>
。