[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