]> git.saurik.com Git - wxWidgets.git/blame - include/wx/dlimpexp.h
in release builds gcc on osx evaporates these inlines if not WXEXPORTed
[wxWidgets.git] / include / wx / dlimpexp.h
CommitLineData
0cc66b6c
VZ
1/*
2 * Name: wx/dlimpexp.h
3 * Purpose: Macros for declaring DLL-imported/exported functions
4 * Author: Vadim Zeitlin
5 * Modified by:
6 * Created: 16.10.2003 (extracted from wx/defs.h)
7 * RCS-ID: $Id$
77ffb593 8 * Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org>
65571936 9 * Licence: wxWindows licence
0cc66b6c
VZ
10 */
11
12/*
13 This is a C file, not C++ one, do not use C++ comments here!
14 */
15
16#ifndef _WX_DLIMPEXP_H_
17#define _WX_DLIMPEXP_H_
18
b9d4eff6
VS
19#if defined(HAVE_VISIBILITY)
20# define WXEXPORT __attribute__ ((visibility("default")))
21# define WXIMPORT __attribute__ ((visibility("default")))
22#elif defined(__WINDOWS__)
0cc66b6c
VZ
23 /*
24 __declspec works in BC++ 5 and later, Watcom C++ 11.0 and later as well
25 as VC++ and gcc
26 */
27# if defined(__VISUALC__) || defined(__BORLANDC__) || defined(__GNUC__) || defined(__WATCOMC__)
28# define WXEXPORT __declspec(dllexport)
29# define WXIMPORT __declspec(dllimport)
30# else /* compiler doesn't support __declspec() */
31# define WXEXPORT
32# define WXIMPORT
33# endif
34#elif defined(__WXPM__)
35# if defined (__WATCOMC__)
36# define WXEXPORT __declspec(dllexport)
37 /*
38 __declspec(dllimport) prepends __imp to imported symbols. We do NOT
39 want that!
40 */
41# define WXIMPORT
fd928524
DW
42# elif defined(__EMX__)
43# define WXEXPORT
44# define WXIMPORT
0cc66b6c
VZ
45# elif (!(defined(__VISAGECPP__) && (__IBMCPP__ < 400 || __IBMC__ < 400 )))
46# define WXEXPORT _Export
47# define WXIMPORT _Export
48# endif
49#elif defined(__WXMAC__) || defined(__WXCOCOA__)
50# ifdef __MWERKS__
51# define WXEXPORT __declspec(export)
52# define WXIMPORT __declspec(import)
53# endif
7275146d
MW
54#elif defined(__CYGWIN__)
55# define WXEXPORT __declspec(dllexport)
56# define WXIMPORT __declspec(dllimport)
0cc66b6c
VZ
57#endif
58
59/* for other platforms/compilers we don't anything */
60#ifndef WXEXPORT
61# define WXEXPORT
62# define WXIMPORT
63#endif
64
65/*
77ffb593 66 We support building wxWidgets as a set of several libraries but we don't
0cc66b6c
VZ
67 support arbitrary combinations of libs/DLLs: either we build all of them as
68 DLLs (in which case WXMAKINGDLL is defined) or none (it isn't).
69
53a2db12 70 However we have a problem because we need separate WXDLLIMPEXP versions for
0cc66b6c
VZ
71 different libraries as, for example, wxString class should be dllexported
72 when compiled in wxBase and dllimported otherwise, so we do define separate
73 WXMAKING/USINGDLL_XYZ constants for each component XYZ.
74 */
75#ifdef WXMAKINGDLL
76# if wxUSE_BASE
77# define WXMAKINGDLL_BASE
78# endif
79
80# define WXMAKINGDLL_NET
81# define WXMAKINGDLL_CORE
82# define WXMAKINGDLL_ADV
f5a9eef7 83# define WXMAKINGDLL_QA
0cc66b6c 84# define WXMAKINGDLL_HTML
0ae4d121 85# define WXMAKINGDLL_GL
0cc66b6c 86# define WXMAKINGDLL_XML
c846884b 87# define WXMAKINGDLL_XRC
5e4903f5 88# define WXMAKINGDLL_AUI
3b2cb431 89# define WXMAKINGDLL_RICHTEXT
c220a8ec 90# define WXMAKINGDLL_MEDIA
c079af66 91# define WXMAKINGDLL_STC
0cc66b6c
VZ
92#endif /* WXMAKINGDLL */
93
94/*
53a2db12 95 WXDLLIMPEXP_CORE maps to export declaration when building the DLL, to import
0cc66b6c
VZ
96 declaration if using it or to nothing at all if we don't use wxWin as DLL
97 */
98#ifdef WXMAKINGDLL_BASE
99# define WXDLLIMPEXP_BASE WXEXPORT
100# define WXDLLIMPEXP_DATA_BASE(type) WXEXPORT type
101#elif defined(WXUSINGDLL)
102# define WXDLLIMPEXP_BASE WXIMPORT
103# define WXDLLIMPEXP_DATA_BASE(type) WXIMPORT type
104#else /* not making nor using DLL */
105# define WXDLLIMPEXP_BASE
106# define WXDLLIMPEXP_DATA_BASE(type) type
107#endif
108
109#ifdef WXMAKINGDLL_NET
110# define WXDLLIMPEXP_NET WXEXPORT
111# define WXDLLIMPEXP_DATA_NET(type) WXEXPORT type
112#elif defined(WXUSINGDLL)
113# define WXDLLIMPEXP_NET WXIMPORT
114# define WXDLLIMPEXP_DATA_NET(type) WXIMPORT type
115#else /* not making nor using DLL */
116# define WXDLLIMPEXP_NET
117# define WXDLLIMPEXP_DATA_NET(type) type
118#endif
119
120#ifdef WXMAKINGDLL_CORE
121# define WXDLLIMPEXP_CORE WXEXPORT
122# define WXDLLIMPEXP_DATA_CORE(type) WXEXPORT type
123#elif defined(WXUSINGDLL)
124# define WXDLLIMPEXP_CORE WXIMPORT
125# define WXDLLIMPEXP_DATA_CORE(type) WXIMPORT type
126#else /* not making nor using DLL */
127# define WXDLLIMPEXP_CORE
128# define WXDLLIMPEXP_DATA_CORE(type) type
129#endif
130
131#ifdef WXMAKINGDLL_ADV
132# define WXDLLIMPEXP_ADV WXEXPORT
133# define WXDLLIMPEXP_DATA_ADV(type) WXEXPORT type
134#elif defined(WXUSINGDLL)
135# define WXDLLIMPEXP_ADV WXIMPORT
136# define WXDLLIMPEXP_DATA_ADV(type) WXIMPORT type
137#else /* not making nor using DLL */
138# define WXDLLIMPEXP_ADV
139# define WXDLLIMPEXP_DATA_ADV(type) type
140#endif
141
61639efb
VZ
142#ifdef WXMAKINGDLL_QA
143# define WXDLLIMPEXP_QA WXEXPORT
144# define WXDLLIMPEXP_DATA_QA(type) WXEXPORT type
145#elif defined(WXUSINGDLL)
146# define WXDLLIMPEXP_QA WXIMPORT
147# define WXDLLIMPEXP_DATA_QA(type) WXIMPORT type
148#else /* not making nor using DLL */
149# define WXDLLIMPEXP_QA
150# define WXDLLIMPEXP_DATA_QA(type) type
151#endif
152
0cc66b6c
VZ
153#ifdef WXMAKINGDLL_HTML
154# define WXDLLIMPEXP_HTML WXEXPORT
155# define WXDLLIMPEXP_DATA_HTML(type) WXEXPORT type
156#elif defined(WXUSINGDLL)
157# define WXDLLIMPEXP_HTML WXIMPORT
158# define WXDLLIMPEXP_DATA_HTML(type) WXIMPORT type
159#else /* not making nor using DLL */
160# define WXDLLIMPEXP_HTML
161# define WXDLLIMPEXP_DATA_HTML(type) type
162#endif
163
164#ifdef WXMAKINGDLL_GL
165# define WXDLLIMPEXP_GL WXEXPORT
166#elif defined(WXUSINGDLL)
167# define WXDLLIMPEXP_GL WXIMPORT
168#else /* not making nor using DLL */
169# define WXDLLIMPEXP_GL
170#endif
171
172#ifdef WXMAKINGDLL_XML
173# define WXDLLIMPEXP_XML WXEXPORT
174#elif defined(WXUSINGDLL)
175# define WXDLLIMPEXP_XML WXIMPORT
176#else /* not making nor using DLL */
177# define WXDLLIMPEXP_XML
178#endif
179
c846884b
RD
180#ifdef WXMAKINGDLL_XRC
181# define WXDLLIMPEXP_XRC WXEXPORT
182#elif defined(WXUSINGDLL)
183# define WXDLLIMPEXP_XRC WXIMPORT
184#else /* not making nor using DLL */
185# define WXDLLIMPEXP_XRC
186#endif
187
5e4903f5
JS
188#ifdef WXMAKINGDLL_AUI
189# define WXDLLIMPEXP_AUI WXEXPORT
190#elif defined(WXUSINGDLL)
191# define WXDLLIMPEXP_AUI WXIMPORT
192#else /* not making nor using DLL */
193# define WXDLLIMPEXP_AUI
194#endif
195
1c4293cb
VZ
196#ifdef WXMAKINGDLL_PROPGRID
197# define WXDLLIMPEXP_PROPGRID WXEXPORT
198#elif defined(WXUSINGDLL)
199# define WXDLLIMPEXP_PROPGRID WXIMPORT
200#else /* not making nor using DLL */
201# define WXDLLIMPEXP_PROPGRID
202#endif
203
3b2cb431
JS
204#ifdef WXMAKINGDLL_RICHTEXT
205# define WXDLLIMPEXP_RICHTEXT WXEXPORT
206#elif defined(WXUSINGDLL)
207# define WXDLLIMPEXP_RICHTEXT WXIMPORT
208#else /* not making nor using DLL */
209# define WXDLLIMPEXP_RICHTEXT
210#endif
211
ff2b312f
RN
212#ifdef WXMAKINGDLL_MEDIA
213# define WXDLLIMPEXP_MEDIA WXEXPORT
214#elif defined(WXUSINGDLL)
215# define WXDLLIMPEXP_MEDIA WXIMPORT
216#else /* not making nor using DLL */
217# define WXDLLIMPEXP_MEDIA
218#endif
219
c079af66
VZ
220#ifdef WXMAKINGDLL_STC
221 #define WXDLLIMPEXP_STC WXEXPORT
222#elif defined(WXUSINGDLL)
223 #define WXDLLIMPEXP_STC WXIMPORT
224#else /* not making nor using DLL */
225 #define WXDLLIMPEXP_STC
226#endif
227
8ece1737
VZ
228/*
229 GCC warns about using __attribute__ (and also __declspec in mingw32 case) on
230 forward declarations while MSVC complains about forward declarations without
231 __declspec for the classes later declared with it, so we need a separate set
232 of macros for forward declarations to hide this difference:
233 */
234#if defined(HAVE_VISIBILITY) || (defined(__WINDOWS__) && defined(__GNUC__))
0ff20b9f
VS
235 #define WXDLLIMPEXP_FWD_BASE
236 #define WXDLLIMPEXP_FWD_NET
237 #define WXDLLIMPEXP_FWD_CORE
238 #define WXDLLIMPEXP_FWD_ADV
239 #define WXDLLIMPEXP_FWD_QA
0ff20b9f
VS
240 #define WXDLLIMPEXP_FWD_HTML
241 #define WXDLLIMPEXP_FWD_GL
242 #define WXDLLIMPEXP_FWD_XML
243 #define WXDLLIMPEXP_FWD_XRC
244 #define WXDLLIMPEXP_FWD_AUI
245 #define WXDLLIMPEXP_FWD_RICHTEXT
246 #define WXDLLIMPEXP_FWD_MEDIA
247 #define WXDLLIMPEXP_FWD_STC
248#else
249 #define WXDLLIMPEXP_FWD_BASE WXDLLIMPEXP_BASE
250 #define WXDLLIMPEXP_FWD_NET WXDLLIMPEXP_NET
251 #define WXDLLIMPEXP_FWD_CORE WXDLLIMPEXP_CORE
252 #define WXDLLIMPEXP_FWD_ADV WXDLLIMPEXP_ADV
253 #define WXDLLIMPEXP_FWD_QA WXDLLIMPEXP_QA
0ff20b9f
VS
254 #define WXDLLIMPEXP_FWD_HTML WXDLLIMPEXP_HTML
255 #define WXDLLIMPEXP_FWD_GL WXDLLIMPEXP_GL
256 #define WXDLLIMPEXP_FWD_XML WXDLLIMPEXP_XML
257 #define WXDLLIMPEXP_FWD_XRC WXDLLIMPEXP_XRC
258 #define WXDLLIMPEXP_FWD_AUI WXDLLIMPEXP_AUI
259 #define WXDLLIMPEXP_FWD_RICHTEXT WXDLLIMPEXP_RICHTEXT
260 #define WXDLLIMPEXP_FWD_MEDIA WXDLLIMPEXP_MEDIA
261 #define WXDLLIMPEXP_FWD_STC WXDLLIMPEXP_STC
262#endif
b5dbe15d 263
0cc66b6c
VZ
264/* for backwards compatibility, define suffix-less versions too */
265#define WXDLLEXPORT WXDLLIMPEXP_CORE
266#define WXDLLEXPORT_DATA WXDLLIMPEXP_DATA_CORE
267
7c77f334
VZ
268/*
269 MSVC up to 6.0 needs to be explicitly told to export template instantiations
270 used by the DLL clients, use this macro to do it like this:
271
272 template <typename T> class Foo { ... };
273 WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( Foo<int> )
274
16361ec9 275 (notice that currently we only need this for wxBase and wxCore libraries)
7c77f334
VZ
276 */
277#if defined(__VISUALC__) && (__VISUALC__ <= 1200)
278 #ifdef WXMAKINGDLL_BASE
279 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl) \
280 template class WXDLLIMPEXP_BASE decl;
16361ec9
VS
281 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_CORE(decl) \
282 template class WXDLLIMPEXP_CORE decl;
7c77f334
VZ
283 #else
284 /*
285 We need to disable this warning when using this macro, as
53a2db12 286 recommended by Microsoft itself:
7c77f334
VZ
287
288 http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b168958
289 */
290 #pragma warning(disable:4231)
291
292 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl) \
293 extern template class WXDLLIMPEXP_BASE decl;
16361ec9
VS
294 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_CORE(decl) \
295 extern template class WXDLLIMPEXP_CORE decl;
7c77f334
VZ
296 #endif
297#else /* not VC <= 6 */
298 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl)
16361ec9 299 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_CORE(decl)
7c77f334
VZ
300#endif /* VC6/others */
301
0cc66b6c
VZ
302#endif /* _WX_DLIMPEXP_H_ */
303