For the ProbABEL project I’m working on I wanted to test for the presence of the Eigen header files using . Eigen is a C++ template library for linear algebra. It basically consists of a bunch of header files. On my PC the Eigen files are installed in /usr/include/eigen3/ since I used the Debian/Ubuntu libeigen3-dev package.
I first tried to test for the headers by simply including
AC_CHECK_HEADERS([eigen3/Eigen/Dense])
in configure.ac, but that didn’t work:
... checking eigen3/Eigen/Dense usability... no checking eigen3/Eigen/Dense presence... no checking for eigen3/Eigen/Dense... no ...
It turns out that you have to add the following lines to configure.ac:
AC_LANG_PUSH([C++]) AC_CHECK_HEADERS([eigen3/Eigen/Dense]) AC_LANG_POP([C++])
Now I get the following output when running ./configure:
... checking how to run the C++ preprocessor... g++ -E checking eigen3/Eigen/Dense usability... yes checking eigen3/Eigen/Dense presence... yes checking for eigen3/Eigen/Dense... yes ...
To go into a bit more detail, these are the errors in config.log without the AC_LANG options:
... configure:4877: checking eigen3/Eigen/Dense usability configure:4877: gcc -c -g -O2 -Wall conftest.c >&5 In file included from /usr/include/eigen3/Eigen/Core:35:0, from /usr/include/eigen3/Eigen/Dense:1, from conftest.c:67: /usr/include/eigen3/Eigen/src/Core/util/Macros.h:188:5: error: unknown type name 'namespace' /usr/include/eigen3/Eigen/src/Core/util/Macros.h:188:21: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token In file included from /usr/include/eigen3/Eigen/Dense:1:0, from conftest.c:67: /usr/include/eigen3/Eigen/Core:98:12: error: expected identifier or '(' before string constant In file included from /usr/include/eigen3/Eigen/Dense:1:0, from conftest.c:67: /usr/include/eigen3/Eigen/Core:144:18: fatal error: cerrno: No such file or directory ...
It seems to be the case that AC_LANG is set to C instead of C++ and consequently compilation of autoconf’s test programme fails. The AC_LANG_PUSH option forces autoconf to use C++.
Thanks to this post on Stack Overflow I could solve this problem.