为什么';当.h文件明显可用时,autoconf是否通过AC\u检查\u头测试?
我花了很长时间让autoconf检查是否存在特定的头文件 让我们将标题依赖项称为“inky.h”,并假设inky是一个库,它的安装(分别)前缀设置为“/usr/local”。这会将“inky.h”放在/usr/local/inky/inky.h中,将libinky.so放在/usr/local/lib中 现在,我正在尝试验证我的应用程序configure.ac中是否存在inky.h,如下所示:为什么';当.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/
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++])