]>
git.saurik.com Git - wxWidgets.git/blob - include/wx/dlimpexp.h
3 * Purpose: Macros for declaring DLL-imported/exported functions
4 * Author: Vadim Zeitlin
6 * Created: 16.10.2003 (extracted from wx/defs.h)
8 * Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org>
9 * Licence: wxWindows licence
13 This is a C file, not C++ one, do not use C++ comments here!
16 #ifndef _WX_DLIMPEXP_H_
17 #define _WX_DLIMPEXP_H_
19 #if defined(HAVE_VISIBILITY)
20 # define WXEXPORT __attribute__ ((visibility("default")))
21 # define WXIMPORT __attribute__ ((visibility("default")))
22 #elif defined(__WINDOWS__)
24 __declspec works in BC++ 5 and later, Watcom C++ 11.0 and later as well
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() */
34 #elif defined(__WXPM__)
35 # if defined (__WATCOMC__)
36 # define WXEXPORT __declspec(dllexport)
38 __declspec(dllimport) prepends __imp to imported symbols. We do NOT
42 # elif defined(__EMX__)
45 # elif (!(defined(__VISAGECPP__) && (__IBMCPP__ < 400 || __IBMC__ < 400 )))
46 # define WXEXPORT _Export
47 # define WXIMPORT _Export
49 #elif defined(__WXMAC__) || defined(__WXCOCOA__)
51 # define WXEXPORT __declspec(export)
52 # define WXIMPORT __declspec(import)
54 #elif defined(__CYGWIN__)
55 # define WXEXPORT __declspec(dllexport)
56 # define WXIMPORT __declspec(dllimport)
59 /* for other platforms/compilers we don't anything */
66 We support building wxWidgets as a set of several libraries but we don't
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).
70 However we have a problem because we need separate WXDLLIMPEXP versions for
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.
77 # define WXMAKINGDLL_BASE
80 # define WXMAKINGDLL_NET
81 # define WXMAKINGDLL_CORE
82 # define WXMAKINGDLL_ADV
83 # define WXMAKINGDLL_QA
84 # define WXMAKINGDLL_HTML
85 # define WXMAKINGDLL_GL
86 # define WXMAKINGDLL_XML
87 # define WXMAKINGDLL_XRC
88 # define WXMAKINGDLL_AUI
89 # define WXMAKINGDLL_PROPGRID
90 # define WXMAKINGDLL_RICHTEXT
91 # define WXMAKINGDLL_MEDIA
92 # define WXMAKINGDLL_STC
93 #endif /* WXMAKINGDLL */
96 WXDLLIMPEXP_CORE maps to export declaration when building the DLL, to import
97 declaration if using it or to nothing at all if we don't use wxWin as DLL
99 #ifdef WXMAKINGDLL_BASE
100 # define WXDLLIMPEXP_BASE WXEXPORT
101 # define WXDLLIMPEXP_DATA_BASE(type) WXEXPORT type
102 # if defined(HAVE_VISIBILITY)
103 # define WXDLLIMPEXP_INLINE_BASE WXEXPORT
105 # define WXDLLIMPEXP_INLINE_BASE
107 #elif defined(WXUSINGDLL)
108 # define WXDLLIMPEXP_BASE WXIMPORT
109 # define WXDLLIMPEXP_DATA_BASE(type) WXIMPORT type
110 # if defined(HAVE_VISIBILITY)
111 # define WXDLLIMPEXP_INLINE_BASE WXIMPORT
113 # define WXDLLIMPEXP_INLINE_BASE
115 #else /* not making nor using DLL */
116 # define WXDLLIMPEXP_BASE
117 # define WXDLLIMPEXP_DATA_BASE(type) type
118 # define WXDLLIMPEXP_INLINE_BASE
121 #ifdef WXMAKINGDLL_NET
122 # define WXDLLIMPEXP_NET WXEXPORT
123 # define WXDLLIMPEXP_DATA_NET(type) WXEXPORT type
124 #elif defined(WXUSINGDLL)
125 # define WXDLLIMPEXP_NET WXIMPORT
126 # define WXDLLIMPEXP_DATA_NET(type) WXIMPORT type
127 #else /* not making nor using DLL */
128 # define WXDLLIMPEXP_NET
129 # define WXDLLIMPEXP_DATA_NET(type) type
132 #ifdef WXMAKINGDLL_CORE
133 # define WXDLLIMPEXP_CORE WXEXPORT
134 # define WXDLLIMPEXP_DATA_CORE(type) WXEXPORT type
135 # if defined(HAVE_VISIBILITY)
136 # define WXDLLIMPEXP_INLINE_CORE WXEXPORT
138 # define WXDLLIMPEXP_INLINE_CORE
140 #elif defined(WXUSINGDLL)
141 # define WXDLLIMPEXP_CORE WXIMPORT
142 # define WXDLLIMPEXP_DATA_CORE(type) WXIMPORT type
143 # if defined(HAVE_VISIBILITY)
144 # define WXDLLIMPEXP_INLINE_CORE WXIMPORT
146 # define WXDLLIMPEXP_INLINE_CORE
148 #else /* not making nor using DLL */
149 # define WXDLLIMPEXP_CORE
150 # define WXDLLIMPEXP_DATA_CORE(type) type
151 # define WXDLLIMPEXP_INLINE_CORE
154 #ifdef WXMAKINGDLL_ADV
155 # define WXDLLIMPEXP_ADV WXEXPORT
156 # define WXDLLIMPEXP_DATA_ADV(type) WXEXPORT type
157 #elif defined(WXUSINGDLL)
158 # define WXDLLIMPEXP_ADV WXIMPORT
159 # define WXDLLIMPEXP_DATA_ADV(type) WXIMPORT type
160 #else /* not making nor using DLL */
161 # define WXDLLIMPEXP_ADV
162 # define WXDLLIMPEXP_DATA_ADV(type) type
165 #ifdef WXMAKINGDLL_QA
166 # define WXDLLIMPEXP_QA WXEXPORT
167 # define WXDLLIMPEXP_DATA_QA(type) WXEXPORT type
168 #elif defined(WXUSINGDLL)
169 # define WXDLLIMPEXP_QA WXIMPORT
170 # define WXDLLIMPEXP_DATA_QA(type) WXIMPORT type
171 #else /* not making nor using DLL */
172 # define WXDLLIMPEXP_QA
173 # define WXDLLIMPEXP_DATA_QA(type) type
176 #ifdef WXMAKINGDLL_HTML
177 # define WXDLLIMPEXP_HTML WXEXPORT
178 # define WXDLLIMPEXP_DATA_HTML(type) WXEXPORT type
179 #elif defined(WXUSINGDLL)
180 # define WXDLLIMPEXP_HTML WXIMPORT
181 # define WXDLLIMPEXP_DATA_HTML(type) WXIMPORT type
182 #else /* not making nor using DLL */
183 # define WXDLLIMPEXP_HTML
184 # define WXDLLIMPEXP_DATA_HTML(type) type
187 #ifdef WXMAKINGDLL_GL
188 # define WXDLLIMPEXP_GL WXEXPORT
189 #elif defined(WXUSINGDLL)
190 # define WXDLLIMPEXP_GL WXIMPORT
191 #else /* not making nor using DLL */
192 # define WXDLLIMPEXP_GL
195 #ifdef WXMAKINGDLL_XML
196 # define WXDLLIMPEXP_XML WXEXPORT
197 #elif defined(WXUSINGDLL)
198 # define WXDLLIMPEXP_XML WXIMPORT
199 #else /* not making nor using DLL */
200 # define WXDLLIMPEXP_XML
203 #ifdef WXMAKINGDLL_XRC
204 # define WXDLLIMPEXP_XRC WXEXPORT
205 #elif defined(WXUSINGDLL)
206 # define WXDLLIMPEXP_XRC WXIMPORT
207 #else /* not making nor using DLL */
208 # define WXDLLIMPEXP_XRC
211 #ifdef WXMAKINGDLL_AUI
212 # define WXDLLIMPEXP_AUI WXEXPORT
213 #elif defined(WXUSINGDLL)
214 # define WXDLLIMPEXP_AUI WXIMPORT
215 #else /* not making nor using DLL */
216 # define WXDLLIMPEXP_AUI
219 #ifdef WXMAKINGDLL_PROPGRID
220 # define WXDLLIMPEXP_PROPGRID WXEXPORT
221 # define WXDLLIMPEXP_DATA_PROPGRID(type) WXEXPORT type
222 #elif defined(WXUSINGDLL)
223 # define WXDLLIMPEXP_PROPGRID WXIMPORT
224 # define WXDLLIMPEXP_DATA_PROPGRID(type) WXIMPORT type
225 #else /* not making nor using DLL */
226 # define WXDLLIMPEXP_PROPGRID
227 # define WXDLLIMPEXP_DATA_PROPGRID(type) type
230 #ifdef WXMAKINGDLL_RICHTEXT
231 # define WXDLLIMPEXP_RICHTEXT WXEXPORT
232 #elif defined(WXUSINGDLL)
233 # define WXDLLIMPEXP_RICHTEXT WXIMPORT
234 #else /* not making nor using DLL */
235 # define WXDLLIMPEXP_RICHTEXT
238 #ifdef WXMAKINGDLL_MEDIA
239 # define WXDLLIMPEXP_MEDIA WXEXPORT
240 #elif defined(WXUSINGDLL)
241 # define WXDLLIMPEXP_MEDIA WXIMPORT
242 #else /* not making nor using DLL */
243 # define WXDLLIMPEXP_MEDIA
246 #ifdef WXMAKINGDLL_STC
247 # define WXDLLIMPEXP_STC WXEXPORT
248 # define WXDLLIMPEXP_DATA_STC(type) WXEXPORT type
249 #elif defined(WXUSINGDLL)
250 # define WXDLLIMPEXP_STC WXIMPORT
251 # define WXDLLIMPEXP_DATA_STC(type) WXIMPORT type
252 #else /* not making nor using DLL */
253 # define WXDLLIMPEXP_STC
254 # define WXDLLIMPEXP_DATA_STC(type) type
258 GCC warns about using __attribute__ (and also __declspec in mingw32 case) on
259 forward declarations while MSVC complains about forward declarations without
260 __declspec for the classes later declared with it, so we need a separate set
261 of macros for forward declarations to hide this difference:
263 #if defined(HAVE_VISIBILITY) || (defined(__WINDOWS__) && defined(__GNUC__))
264 #define WXDLLIMPEXP_FWD_BASE
265 #define WXDLLIMPEXP_FWD_NET
266 #define WXDLLIMPEXP_FWD_CORE
267 #define WXDLLIMPEXP_FWD_ADV
268 #define WXDLLIMPEXP_FWD_QA
269 #define WXDLLIMPEXP_FWD_HTML
270 #define WXDLLIMPEXP_FWD_GL
271 #define WXDLLIMPEXP_FWD_XML
272 #define WXDLLIMPEXP_FWD_XRC
273 #define WXDLLIMPEXP_FWD_AUI
274 #define WXDLLIMPEXP_FWD_PROPGRID
275 #define WXDLLIMPEXP_FWD_RICHTEXT
276 #define WXDLLIMPEXP_FWD_MEDIA
277 #define WXDLLIMPEXP_FWD_STC
279 #define WXDLLIMPEXP_FWD_BASE WXDLLIMPEXP_BASE
280 #define WXDLLIMPEXP_FWD_NET WXDLLIMPEXP_NET
281 #define WXDLLIMPEXP_FWD_CORE WXDLLIMPEXP_CORE
282 #define WXDLLIMPEXP_FWD_ADV WXDLLIMPEXP_ADV
283 #define WXDLLIMPEXP_FWD_QA WXDLLIMPEXP_QA
284 #define WXDLLIMPEXP_FWD_HTML WXDLLIMPEXP_HTML
285 #define WXDLLIMPEXP_FWD_GL WXDLLIMPEXP_GL
286 #define WXDLLIMPEXP_FWD_XML WXDLLIMPEXP_XML
287 #define WXDLLIMPEXP_FWD_XRC WXDLLIMPEXP_XRC
288 #define WXDLLIMPEXP_FWD_AUI WXDLLIMPEXP_AUI
289 #define WXDLLIMPEXP_FWD_PROPGRID WXDLLIMPEXP_PROPGRID
290 #define WXDLLIMPEXP_FWD_RICHTEXT WXDLLIMPEXP_RICHTEXT
291 #define WXDLLIMPEXP_FWD_MEDIA WXDLLIMPEXP_MEDIA
292 #define WXDLLIMPEXP_FWD_STC WXDLLIMPEXP_STC
295 /* for backwards compatibility, define suffix-less versions too */
296 #define WXDLLEXPORT WXDLLIMPEXP_CORE
297 #define WXDLLEXPORT_DATA WXDLLIMPEXP_DATA_CORE
300 MSVC up to 6.0 needs to be explicitly told to export template instantiations
301 used by the DLL clients, use this macro to do it like this:
303 template <typename T> class Foo { ... };
304 WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( Foo<int> )
306 (notice that currently we only need this for wxBase and wxCore libraries)
308 #if defined(__VISUALC__) && (__VISUALC__ <= 1200)
309 #ifdef WXMAKINGDLL_BASE
310 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl) \
311 template class WXDLLIMPEXP_BASE decl;
312 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_CORE(decl) \
313 template class WXDLLIMPEXP_CORE decl;
316 We need to disable this warning when using this macro, as
317 recommended by Microsoft itself:
319 http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b168958
321 #pragma warning(disable:4231)
323 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl) \
324 extern template class WXDLLIMPEXP_BASE decl;
325 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_CORE(decl) \
326 extern template class WXDLLIMPEXP_CORE decl;
328 #else /* not VC <= 6 */
329 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl)
330 #define WXDLLIMPEXP_TEMPLATE_INSTANCE_CORE(decl)
331 #endif /* VC6/others */
333 #endif /* _WX_DLIMPEXP_H_ */