为什么';当.h文件明显可用时,autoconf是否通过AC\u检查\u头测试?

为什么';当.h文件明显可用时,autoconf是否通过AC\u检查\u头测试?,c,autoconf,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/

我花了很长时间让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之后)生成以下输出:

现在,情况似乎是这样的,因为inky.h包含两个其他头,所以我将它们添加到AC_CHECK_头的第四个参数中,如下所示:

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束手无策。有人知道我哪里出了问题吗。是否可以让configure提供有关失败原因的更多详细信息?为什么我可以找到文件本身,但AC_CHECK_HEADER宏失败

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

还要注意的是,实际的图书馆并没有命名为“inky”。然而,这个项目有一个“仅供官方使用”的问题,所以我更改了名称以保护……好吧,为了保护我自己

[编辑-结束]
解决了问题。查看我的答案。

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

  • 由于您没有将使用
    AC_CHECK_FILE
    找到的路径添加到
    CPPFLAGS
    INCLUDES
    或当前使用的任何
    autoconf
  • AC_CHECK_HEADER
    在使用预处理器编译时找不到报头(原因除了
    cppfaglass
    包含中缺少报头之外)

  • AC\u CHECK\u HEADER
    的第四个参数不是头的列表,而是一些执行include的C代码

    也许可以试着做一些类似的事情

    AC_CHECK_HEADER([inky.h],
    [],
    [AC_MSG_ERROR([Couldn't find or include inky.h])],
    [#include <dinky.h>
    #include <plinky.h>
    ])
    
    AC\u CHECK\u头([inky.h],
    [],
    [AC_MSG_错误([无法找到或包含inky.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
    ])
    
    AC_CHECK_头([dinky.h plinky.h inky.h],
    [],
    [AC_MSG_错误([无法找到或包含此标头]),
    如果你有一点
    #包括
    #恩迪夫
    #如果你有
    #包括
    #恩迪夫
    ])
    
    我找到了问题所在。我正在使用的库是C库,但是我链接的“nky'”库是C++库。因此,在configure.AC脚本的早期,语言(
    AC_LANG
    )被设置为C。在执行“nKy”检查时,我需要将语言更改为C++,以便AutoCONF使用C++编译器代替C编译器。通过使用以下工具,这一点相当容易实现:

    AC_LANG_PUSH([C++])
    dnl # Do the checks for inky
    AC_LANG_POP([C++])
    
    这解决了我在这个线程中询问的问题,也解决了我还没有发布的问题,其中我无法让
    AC\u CHECK\u LIB
    宏工作

    谢谢大家的意见。

    这可能只是一个输入错误,但您不能在
    LDFLAGS
    =“…”
    (除非您想用
    =“…”运行程序
    LDFALGS
    作为第一个参数。谢谢。我几分钟前就发现了这个错误,但你肯定是对的。我非常讨厌Autoconf的一个特点是间距规则的僵化。谢谢。你对第四个参数的看法是对的。我试过了,但不幸的是,它没有解决问题。它就像一句话一样有意义还有。添加一个“或”并保留列表?@KarlRichter这篇文章我已经读了大约10次了。现在它看起来是一个完整的句子。很抱歉让人困惑,你在第一次编辑时似乎是对的。我也是:)我认为新版本(将要审查)重用了句子的后半部分(以前是第二个列表项)澄清可能还有其他原因。WFM
    AC_LANG_PUSH([C++])
    dnl # Do the checks for inky
    AC_LANG_POP([C++])