Suppose we have something like AC_CHECK_FUNCS([setitimer], [], AC_MSG_ERROR([...])) then autoconf (version 2.54c and previous ones) tries to compile a program containing (inessential lines snipped) #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char setitimer (); char (*f) (); int main () { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_setitimer) || defined (__stub___setitimer) choke me #else f = setitimer; #endif The problem is with the assignment `f = setitimer;' in case we are using a standard conforming (strictly speaking) C++ compiler. In fact, in standard C++, a value of type "char (*)() C" (a C function) cannot be assigned to an entity of type "char (*)()" (a C++ function). The fix is easy: it suffices to change autoconf so that, instead of generating ------------------------------------------------------------------ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char setitimer (); char (*f) (); ------------------------------------------------------------------ it produces ------------------------------------------------------------------ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char setitimer (); char (*f) (); #ifdef __cplusplus } #endif ------------------------------------------------------------------ so that, in C++, both `f' and `setitimer' have C linkage. All the best Roberto -- Prof. Roberto Bagnara Computer Science Group Department of Mathematics, University of Parma, Italy http://www.cs.unipr.it/~bagnara/ mailto:bagnara@cs.unipr.it