当.h文件清晰可用时,为什么autoconf不通过AC_CHECK_HEADER测试?

时间:2011-05-25 18:21:05

标签: c autoconf

我有时间让autoconf检查是否存在特定的头文件。

让我们调用头依赖项“inky.h”,让我们说inky是一个安装(单独)并且前缀设置为“/ usr / local”的库。这将“inky.h”放在/usr/local/inky/inky.h中,将libinky.so放在/ usr / local / lib中。

现在,我正在尝试在我的应用程序configure.ac中验证inky.h的存在,如下所示:

dnl # Setup temp LDFLAGS and look for inky library/header
LDFLAGS_SAVE=${LDFLAGS};
CPPFLAGS_SAVE=${CPPFLAGS};

dnl # Look for inky on the user specified inky install path
LDFLAGS ="-L${inky_library_path}";
CPPFLAGS="-I${inky_include_path}/inky";

AC_MSG_NOTICE([Looking for inky.h using: ${CPPFLAGS}]);

dnl # This check finds inky.h just fine.  This check was only used for debugging
AC_CHECK_FILE(
   [${inky_include_path}/inky/inky.h],
   [AC_MSG_NOTICE([Found inky.h])],
   [AC_MSG_NOTICE([Didn't find inky.h])]
   )

dnl # Look for the inky header file.  If it isn't found, terminate.
AC_CHECK_HEADER(inky.h,
    [],
    [AC_MSG_ERROR([Couldn't find or include inky.h])]
    )

这将从./configure(在autoreconf -vfi之后)生成以下输出:

configure: Looking for inky.y in fetk include path: -I/usr/local/include/inky.y
checking for /usr/local/include/inky/inky.h... yes
configure: Found inky.h
checking inky.h usability... no
checking inky.h presence... yes
configure: WARNING: inky.h: present but cannot be compiled
configure: WARNING: inky.h:     check for missing prerequisite headers?
configure: WARNING: inky.h: see the Autoconf documentation
configure: WARNING: inky.h:     section "Present But Cannot Be Compiled"
configure: WARNING: inky.h: proceeding with the compiler's result
checking for inky.h... no
configure: error: Couldn't find or include inky.h

现在,情况似乎是因为inky.h包含了2个其他标题,所以我将它们添加到AC_CHECK_HEADER的第四个参数中,如下所示:

dnl # Look for the inky header file.  If it isn't found, terminate.
AC_CHECK_HEADER(inky.h,
    [],
    [AC_MSG_ERROR([Couldn't find or include inky.h])],
    [dinky.h plinky.h]
    )

从./configure:

呈现此输出
configure: Looking for inky in fetk include path: -I/usr/local/include/inky
checking for /usr/local/include/inky/inky.h... yes
configure: Found inky.h
checking for inky.h... no
configure: error: Couldn't find or include inky.h

我最终使用autoconf。有没有人知道我在哪里错了。是否可以通过配置来提供有关失败的更多详细信息?为什么我可以找到文件本身,但AC_CHECK_HEADER宏失败了?

另外,请不要告诉我使用其他套餐分发套件。我自己永远不会选择Autoconf,但我必须在预先存在的项目中添加一些依赖项。

另请注意,实际的库未命名为“inky”。但是,这个项目存在“官方使用”的问题,所以我更改了名称以保护......好吧,保护自己!

[编辑 - 结束] 找出问题所在。看到我的回答。

3 个答案:

答案 0 :(得分:8)

我发现了问题所在。我正在使用的库是一个C库,但我链接的“墨”库是一个C ++库。因此,语言(AC_LANG)在configure.ac脚本的早期设置为C.在执行“inky”检查时,我需要将语言更改为C ++,以便Autoconf使用C ++编译器而不是C编译器。使用以下方法可以轻松完成:

AC_LANG_PUSH([C++])
dnl # Do the checks for inky
AC_LANG_POP([C++])

这解决了我在这个帖子中询问过的问题,以及我还没发布的问题,其中我无法让AC_CHECK_LIB宏工作。

感谢大家的意见。

答案 1 :(得分:4)

AC_CHECK_HEADER的第四个参数不是标题列表,而是一些执行包含的C代码。

也许尝试一下

AC_CHECK_HEADER([inky.h],
[],
[AC_MSG_ERROR([Couldn't find or include inky.h])],
[#include <dinky.h>
#include <plinky.h>
])

甚至

AC_CHECK_HEADERS([dinky.h plinky.h inky.h],
[],
[AC_MSG_ERROR([Couldn't find or include this header])],
[#if HAVE_DINKY_H
#  include <dinky.h>
#endif
#if HAVE_PLINKY_H
#  include <plinky.h>
#endif
])

答案 2 :(得分:3)

有关此测试失败原因的详细信息,请参阅config.log。我的猜测是:

  • 由于您未将AC_CHECK_FILE中找到的路径添加到CPPFLAGSINCLUDESautoconf这些天使用的路径。
  • AC_CHECK_HEADER找不到使用预处理器编译的标头(除了CPPFLAGS中包含的标头包含的其他原因)。