我有时间让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”。但是,这个项目存在“官方使用”的问题,所以我更改了名称以保护......好吧,保护自己!
[编辑 - 结束] 找出问题所在。看到我的回答。
答案 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
中找到的路径添加到CPPFLAGS
或INCLUDES
或autoconf
这些天使用的路径。AC_CHECK_HEADER
找不到使用预处理器编译的标头(除了CPPFLAGS
中包含的标头包含的其他原因)。