Re: how to test HAVE_MALLOC

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Joachim,

Op 5 feb 2010, om 16:55 heeft j.wuttke het volgende geschreven:

> A user of my software package reported that compilation on
> a virtual Linux machine running on his Mac failed because
> '::malloc' was not declared.

I have encountered the same issue as a producer of another software package. I have found the issue is a compound effect of the following three things:

1) in a strictly conforming C++ compiler, when using the "cXXXX" form of the C library headers all the C library declarations are put in the namespace "std", and not the root namespace. When using the plain C header name, the std namespace is not used.

2) you really want to #include <cstdlib> / <stdlib.h> *explicitly* to reach malloc and not rely for its declaration to becomes visible magically through some other include;

3) if your software code is C++ and you want to allow users to use a strictly conforming compiler, then you want to be careful about the way malloc is checked in your configure script. In particular the check for AC_FUNC_MALLOC cannot be run in C++ mode.



To fix the issue the following works for me:


A) in configure.ac, check that malloc is reachable from C++, this way and not with AC_FUNC_MALLOC:

  AC_PROG_CXX
  AC_LANG_PUSH([C++])
  AC_MSG_CHECKING([whether <cstdlib> exposes std::malloc()])
  AC_RUN_IFELSE(AC_LANG_PROGRAM([@%:@include <cstdlib>], [return !std::malloc(10)]),
                [cxx_have_std_malloc=yes], [cxx_have_std_malloc=no])
  AC_MSG_RESULT([$cxx_have_std_malloc])
  AC_MSG_CHECKING([whether <cstdlib> exposes ::malloc()])
  AC_RUN_IFELSE(AC_LANG_PROGRAM([@%:@include <cstdlib>], [return !::malloc(10)]),
                [cxx_have_root_malloc=yes], [cxx_have_root_malloc=no])
  AC_MSG_RESULT([$cxx_have_root_malloc])
  AC_LANG_POP([C++])
  if test $cxx_have_std_malloc = no && test $cxx_have_root_malloc = no; then
      AC_MSG_ERROR([can't use malloc in C++])
  else
      AC_DEFINE([HAVE_MALLOC], 1)
      if test $cxx_have_root_malloc = yes; then
         AC_DEFINE([HAVE_MALLOC_IN_ROOT_NAMESPACE], 1)
      fi
  fi


B) in your source code, be careful to #include <cstdlib> where appropriate;

C) if HAVE_MALLOC_IN_ROOT_NAMESPACE is 0 or not set (as per the check above), be sure that the following appears early where needed in the root namespace before boost headers are included, and after <cstdlib> is included:

   using std::malloc;

If you run into more issues I suggest you ask your customer / user to report the results of config.log and the compilation error message after applying the techniques above, you should then have more information available to troubleshoot further.

Cheers,

-- 
k




_______________________________________________
Autoconf mailing list
Autoconf@xxxxxxx
http://lists.gnu.org/mailman/listinfo/autoconf


[Index of Archives]     [GCC Help]     [Kernel Discussion]     [RPM Discussion]     [Red Hat Development]     [Yosemite News]     [Linux USB]     [Samba]

  Powered by Linux