[CMake] Checking function or symbol in namespace

Michael Wild themiwi at gmail.com
Thu Jan 21 04:14:14 EST 2010


On 21. Jan, 2010, at 9:56 , Marcel Loose wrote:

> On Thu, 2010-01-21 at 06:52 +0100, Michael Wild wrote:
>> On 21. Jan, 2010, at 24:55 , Mateusz Loskot wrote:
>> 
>>> Hi,
>>> 
>>> I'm trying to perform the following checks:
>>> 
>>> check_function_exists(std::pow HAVE_POW)
>>> 
>>> or
>>> 
>>> check_symbol_exists(std::pow cmath HAVE_POW)
>>> 
>>> but it looks that both macros have troubles
>>> with resolving std:: namespace.
>>> 
>>> The documentation is not very clear about that.
>>> 
>>> Or I should stick to try_compile based tests?
>>> 
>>> Best regards,
>>> 
>> 
>> 
>> AFAIK check_symbol_exists is used for preprocessor symbols.
> check_function_exists looks for C functions, not C++. Also notice, that
> older C++ standard libraries and non-compliant C++ compilers don't use
> the namespace std. You might want to have a look at
> CMakeBackwardCompatibilityCXX.cmake or the various other modules it
> uses.
>> 
>> 
>> HTH
>> 
>> Michael
>> 
> I thought that check_symbol_exists() was meant to check for the
> *declaration* of a symbol (e.g. a function) in a header file; and that
> check_function_exists() was meant to check for the *definition* of a
> function (i.e. exists as symbol in a library).
> 
> Best regards,
> Marcel Loose.

Just checked: check_symbol_exists works for both. E.g. testing for deflateInit in zlib.h (which is a #define) results in the following test code:

#include <zlib.h>

void cmakeRequireSymbol(int dummy,...){(void)dummy;}
int main()
{
#ifndef deflateInit
  cmakeRequireSymbol(0,&deflateInit);
#endif
  return 0;
}


As you can see, the code will compile successfully for both cases.

IMHO the documentation should be clarified...


Michael


More information about the CMake mailing list