]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/dlimpexp.h
Better fix
[wxWidgets.git] / include / wx / dlimpexp.h
index cc892158e142a677d24493c70865136628f945a7..13078ba56349ea0fc72eef08715a8e7e4c218d3c 100644 (file)
@@ -5,7 +5,7 @@
  * Modified by:
  * Created:     16.10.2003 (extracted from wx/defs.h)
  * RCS-ID:      $Id$
  * Modified by:
  * Created:     16.10.2003 (extracted from wx/defs.h)
  * RCS-ID:      $Id$
- * Copyright:   (c) 2003 Vadim Zeitlin <vadim@wxwindows.org>
+ * Copyright:   (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org>
  * Licence:     wxWindows licence
  */
 
  * Licence:     wxWindows licence
  */
 
 #ifndef _WX_DLIMPEXP_H_
 #define _WX_DLIMPEXP_H_
 
 #ifndef _WX_DLIMPEXP_H_
 #define _WX_DLIMPEXP_H_
 
-#if defined(__WXMSW__)
+#if defined(HAVE_VISIBILITY)
+#    define WXEXPORT __attribute__ ((visibility("default")))
+#    define WXIMPORT __attribute__ ((visibility("default")))
+#elif defined(__WINDOWS__)
     /*
        __declspec works in BC++ 5 and later, Watcom C++ 11.0 and later as well
        as VC++ and gcc
     /*
        __declspec works in BC++ 5 and later, Watcom C++ 11.0 and later as well
        as VC++ and gcc
@@ -36,6 +39,9 @@
            want that!
          */
 #        define WXIMPORT
            want that!
          */
 #        define WXIMPORT
+#    elif defined(__EMX__)
+#        define WXEXPORT
+#        define WXIMPORT
 #    elif (!(defined(__VISAGECPP__) && (__IBMCPP__ < 400 || __IBMC__ < 400 )))
 #        define WXEXPORT _Export
 #        define WXIMPORT _Export
 #    elif (!(defined(__VISAGECPP__) && (__IBMCPP__ < 400 || __IBMC__ < 400 )))
 #        define WXEXPORT _Export
 #        define WXIMPORT _Export
@@ -45,6 +51,9 @@
 #        define WXEXPORT __declspec(export)
 #        define WXIMPORT __declspec(import)
 #    endif
 #        define WXEXPORT __declspec(export)
 #        define WXIMPORT __declspec(import)
 #    endif
+#elif defined(__CYGWIN__)
+#    define WXEXPORT __declspec(dllexport)
+#    define WXIMPORT __declspec(dllimport)
 #endif
 
 /* for other platforms/compilers we don't anything */
 #endif
 
 /* for other platforms/compilers we don't anything */
@@ -54,7 +63,7 @@
 #endif
 
 /*
 #endif
 
 /*
-   We support building wxWindows as a set of several libraries but we don't
+   We support building wxWidgets as a set of several libraries but we don't
    support arbitrary combinations of libs/DLLs: either we build all of them as
    DLLs (in which case WXMAKINGDLL is defined) or none (it isn't).
 
    support arbitrary combinations of libs/DLLs: either we build all of them as
    DLLs (in which case WXMAKINGDLL is defined) or none (it isn't).
 
 #    define WXMAKINGDLL_NET
 #    define WXMAKINGDLL_CORE
 #    define WXMAKINGDLL_ADV
 #    define WXMAKINGDLL_NET
 #    define WXMAKINGDLL_CORE
 #    define WXMAKINGDLL_ADV
-#    define WXMAKINGDLL_ODBC
-#    define WXMAKINGDLL_DBGRID
+#    define WXMAKINGDLL_QA
 #    define WXMAKINGDLL_HTML
 #    define WXMAKINGDLL_HTML
+#    define WXMAKINGDLL_GL
 #    define WXMAKINGDLL_XML
 #    define WXMAKINGDLL_XML
+#    define WXMAKINGDLL_XRC
+#    define WXMAKINGDLL_AUI
+#    define WXMAKINGDLL_RICHTEXT
+#    define WXMAKINGDLL_MEDIA
+#    define WXMAKINGDLL_STC
 #endif /* WXMAKINGDLL */
 
 /*
 #endif /* WXMAKINGDLL */
 
 /*
 #    define WXDLLIMPEXP_DATA_ADV(type) type
 #endif
 
 #    define WXDLLIMPEXP_DATA_ADV(type) type
 #endif
 
-#ifdef WXMAKINGDLL_ODBC
-#    define WXDLLIMPEXP_ODBC WXEXPORT
-#    define WXDLLIMPEXP_DATA_ODBC(type) WXEXPORT type
-#elif defined(WXUSINGDLL)
-#    define WXDLLIMPEXP_ODBC WXIMPORT
-#    define WXDLLIMPEXP_DATA_ODBC(type) WXIMPORT type
-#else /* not making nor using DLL */
-#    define WXDLLIMPEXP_ODBC
-#    define WXDLLIMPEXP_DATA_ODBC(type) type
-#endif
-
-#ifdef WXMAKINGDLL_DBGRID
-#    define WXDLLIMPEXP_DBGRID WXEXPORT
-#    define WXDLLIMPEXP_DATA_DBGRID(type) WXEXPORT type
+#ifdef WXMAKINGDLL_QA
+#    define WXDLLIMPEXP_QA WXEXPORT
+#    define WXDLLIMPEXP_DATA_QA(type) WXEXPORT type
 #elif defined(WXUSINGDLL)
 #elif defined(WXUSINGDLL)
-#    define WXDLLIMPEXP_DBGRID WXIMPORT
-#    define WXDLLIMPEXP_DATA_DBGRID(type) WXIMPORT type
+#    define WXDLLIMPEXP_QA WXIMPORT
+#    define WXDLLIMPEXP_DATA_QA(type) WXIMPORT type
 #else /* not making nor using DLL */
 #else /* not making nor using DLL */
-#    define WXDLLIMPEXP_DBGRID
-#    define WXDLLIMPEXP_DATA_DBGRID(type) type
+#    define WXDLLIMPEXP_QA
+#    define WXDLLIMPEXP_DATA_QA(type) type
 #endif
 
 #ifdef WXMAKINGDLL_HTML
 #endif
 
 #ifdef WXMAKINGDLL_HTML
 #    define WXDLLIMPEXP_XML
 #endif
 
 #    define WXDLLIMPEXP_XML
 #endif
 
+#ifdef WXMAKINGDLL_XRC
+#    define WXDLLIMPEXP_XRC WXEXPORT
+#elif defined(WXUSINGDLL)
+#    define WXDLLIMPEXP_XRC WXIMPORT
+#else /* not making nor using DLL */
+#    define WXDLLIMPEXP_XRC
+#endif
+
+#ifdef WXMAKINGDLL_AUI
+#    define WXDLLIMPEXP_AUI WXEXPORT
+#elif defined(WXUSINGDLL)
+#    define WXDLLIMPEXP_AUI WXIMPORT
+#else /* not making nor using DLL */
+#    define WXDLLIMPEXP_AUI
+#endif
+
+#ifdef WXMAKINGDLL_RICHTEXT
+#    define WXDLLIMPEXP_RICHTEXT WXEXPORT
+#elif defined(WXUSINGDLL)
+#    define WXDLLIMPEXP_RICHTEXT WXIMPORT
+#else /* not making nor using DLL */
+#    define WXDLLIMPEXP_RICHTEXT
+#endif
+
+#ifdef WXMAKINGDLL_MEDIA
+#    define WXDLLIMPEXP_MEDIA WXEXPORT
+#elif defined(WXUSINGDLL)
+#    define WXDLLIMPEXP_MEDIA WXIMPORT
+#else /* not making nor using DLL */
+#    define WXDLLIMPEXP_MEDIA
+#endif
+
+#ifdef WXMAKINGDLL_STC
+    #define WXDLLIMPEXP_STC WXEXPORT
+#elif defined(WXUSINGDLL)
+    #define WXDLLIMPEXP_STC WXIMPORT
+#else /* not making nor using DLL */
+    #define WXDLLIMPEXP_STC
+#endif
+
+/*
+   GCC warns about using __attribute__ (and also __declspec in mingw32 case) on
+   forward declarations while MSVC complains about forward declarations without
+   __declspec for the classes later declared with it, so we need a separate set
+   of macros for forward declarations to hide this difference:
+ */
+#if defined(HAVE_VISIBILITY) || (defined(__WINDOWS__) && defined(__GNUC__))
+    #define WXDLLIMPEXP_FWD_BASE
+    #define WXDLLIMPEXP_FWD_NET
+    #define WXDLLIMPEXP_FWD_CORE
+    #define WXDLLIMPEXP_FWD_ADV
+    #define WXDLLIMPEXP_FWD_QA
+    #define WXDLLIMPEXP_FWD_HTML
+    #define WXDLLIMPEXP_FWD_GL
+    #define WXDLLIMPEXP_FWD_XML
+    #define WXDLLIMPEXP_FWD_XRC
+    #define WXDLLIMPEXP_FWD_AUI
+    #define WXDLLIMPEXP_FWD_RICHTEXT
+    #define WXDLLIMPEXP_FWD_MEDIA
+    #define WXDLLIMPEXP_FWD_STC
+#else
+    #define WXDLLIMPEXP_FWD_BASE      WXDLLIMPEXP_BASE
+    #define WXDLLIMPEXP_FWD_NET       WXDLLIMPEXP_NET
+    #define WXDLLIMPEXP_FWD_CORE      WXDLLIMPEXP_CORE
+    #define WXDLLIMPEXP_FWD_ADV       WXDLLIMPEXP_ADV
+    #define WXDLLIMPEXP_FWD_QA        WXDLLIMPEXP_QA
+    #define WXDLLIMPEXP_FWD_HTML      WXDLLIMPEXP_HTML
+    #define WXDLLIMPEXP_FWD_GL        WXDLLIMPEXP_GL
+    #define WXDLLIMPEXP_FWD_XML       WXDLLIMPEXP_XML
+    #define WXDLLIMPEXP_FWD_XRC       WXDLLIMPEXP_XRC
+    #define WXDLLIMPEXP_FWD_AUI       WXDLLIMPEXP_AUI
+    #define WXDLLIMPEXP_FWD_RICHTEXT  WXDLLIMPEXP_RICHTEXT
+    #define WXDLLIMPEXP_FWD_MEDIA     WXDLLIMPEXP_MEDIA
+    #define WXDLLIMPEXP_FWD_STC       WXDLLIMPEXP_STC
+#endif
+
 /* for backwards compatibility, define suffix-less versions too */
 #define WXDLLEXPORT WXDLLIMPEXP_CORE
 #define WXDLLEXPORT_DATA WXDLLIMPEXP_DATA_CORE
 
 /* for backwards compatibility, define suffix-less versions too */
 #define WXDLLEXPORT WXDLLIMPEXP_CORE
 #define WXDLLEXPORT_DATA WXDLLIMPEXP_DATA_CORE
 
+/*
+   MSVC up to 6.0 needs to be explicitly told to export template instantiations
+   used by the DLL clients, use this macro to do it like this:
+
+       template <typename T> class Foo { ... };
+       WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( Foo<int> )
+
+   (notice that currently we only need this for the wxBase library)
+ */
+#if defined(__VISUALC__) && (__VISUALC__ <= 1200)
+    #ifdef WXMAKINGDLL_BASE
+        #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl) \
+            template class WXDLLIMPEXP_BASE decl;
+    #else
+        /*
+           We need to disable this warning when using this macro, as
+           recommended by Microsoft itself: 
+
+           http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b168958
+         */
+        #pragma warning(disable:4231)
+
+        #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl) \
+            extern template class WXDLLIMPEXP_BASE decl;
+    #endif
+#else /* not VC <= 6 */
+    #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl)
+#endif /* VC6/others */
+
 #endif /* _WX_DLIMPEXP_H_ */
 
 #endif /* _WX_DLIMPEXP_H_ */