[CMake] Function for visibility definitions

Hendrik Sattler post at hendrik-sattler.de
Thu Feb 11 10:09:34 EST 2010


Zitat von Michael Wild <themiwi at gmail.com>:

>
> On 11. Feb, 2010, at 15:40 , Hendrik Sattler wrote:
>
>> Zitat von Bill Hoffman <bill.hoffman at kitware.com>:
>>> That said, you could have CMake configure a .h file that had this stuff
>>> in it.  It might be nice if the function did that automatically, as it
>>> is almost the same code for every project.  Then once your project was
>>> built with CMake, you would install the configured .h files and other
>>> build systems could still use the software.
>>
>> OTOH, cmake is a build system, not a code generator.
>> This export stuff is so simple[1], why all the hassle to generate it?
>>
>> HS
>>
>> [1]: you only have too cases: Windows and gcc>=4. All compilers on   
>> Windows use the same syntax.
>>
>
> Also refer to http://gcc.gnu.org/wiki/Visibility

...which can be even simplified to:
#if defined _WIN32 || defined __CYGWIN__
   #ifdef PROJECT_EXPORT
     #define DLL_PUBLIC __declspec(dllexport)
   #endif
#else
   #if __GNUC__ >= 4
     #define DLL_PUBLIC __attribute__ ((visibility("default")))
     #define DLL_LOCAL  __attribute__ ((visibility("hidden")))
   #endif
#endif
#ifndef DLL_PUBLIC
   #define DLL_PUBLIC
#endif
#ifndef DLL_LOCAL
   #define DLL_LOCAL
#endif

Note: __declspec(dllimport) is not used here as it is only to be used  
when including a header file for a DLL. This needs a different  
solution (some custom define) in the header, only.

You usually do not need DLL_LOCAL.

Additionally, if you want cross-language bindings, you may want an  
additional symbols file, so the symbol names are simpler. You also  
have to care about calling convention, then. So the defines above a  
only a small part of the deal.

HS




More information about the CMake mailing list