[CMake] Building shared libs on visual
Werner Smekal
smekal at iap.tuwien.ac.at
Wed Sep 24 04:02:31 EDT 2008
Hi Julien,
> This lead me to another question:
> In the wiki page, it is suggested to do the following:
>
> #if defined (_WIN32)
> #if defined(MyLibrary_EXPORTS)
> #define MYLIB_EXPORT __declspec(dllexport)
> #else
> #define MYLIB_EXPORT __declspec(dllimport)
> #endif /* MyLibrary_EXPORTS */
> #else /* defined (_WIN32) */
> #define MYLIB_EXPORT
> #endif
>
> But in this piece of code, the case were we build static libraries
> under
> windows is not handled. This means that we will import/export symbols
> even if we build static libraries, and this seems to break the
> compilation, leading to "undefine reference to declspec(dllimport)
> xxx"
> when trying to link against the library. I did look at the export
> sections of other libraries and they seem to handle this static case
> by
> removing the __declspec(dllexport)/__declspec(dllimport). What is the
> right thing to do here ?
For the PLplot project we use in addtion the macros USINGDLL and
MAKINGDLL which are set if we use the shared library or make the
shared library. But these macros only get defined for the shared case,
so the PLDLLIMPEXP macros are defined to nothing in that case. Here is
the code (which is more or less based on how the wxWidgets project did
it)
#ifndef __PL_DLL_H
#define __PL_DLL_H
#ifdef USINGDLL
#define USINGPLDLL
#endif
#if defined(WIN32)
/* Visual C/C++, Borland, MinGW and Watcom */
#if defined(__VISUALC__) || defined(_MSC_VER) ||
defined(__BORLANDC__) || defined(__GNUC__) || defined(__WATCOMC__)
#define PLDLLEXPORT __declspec(dllexport)
#define PLDLLIMPORT __declspec(dllimport)
#else
#define PLDLLEXPORT
#define PLDLLIMPORT
#endif
#elif defined(__CYGWIN__)
#define PLDLLEXPORT __declspec(dllexport)
#define PLDLLIMPORT __declspec(dllimport)
#endif
#ifndef PLDLLEXPORT
# define PLDLLEXPORT
# define PLDLLIMPORT
#endif
#if defined(MAKINGPLDLL)
#define PLDLLIMPEXP PLDLLEXPORT
#define PLDLLIMPEXP_DATA(type) PLDLLEXPORT type
#elif defined(USINGPLDLL)
#define PLDLLIMPEXP PLDLLIMPORT
#define PLDLLIMPEXP_DATA(type) PLDLLIMPORT type
#else
#define PLDLLIMPEXP
#define PLDLLIMPEXP_DATA(type) type
#endif
#endif /* __PL_DLL_H */
HTH,
Werner
--
Dr. Werner Smekal
Institut fuer Allgemeine Physik
Technische Universitaet Wien
Wiedner Hauptstr 8-10
A-1040 Wien
Austria
email: smekal at iap.tuwien.ac.at
web: http://www.iap.tuwien.ac.at/~smekal
phone: +43-(0)1-58801-13463 (office), +43-(0)1-58801-13469 (laboratory)
fax: +43-(0)1-58801-13499
More information about the CMake
mailing list