dlimpexp.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  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. * Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org>
  8. * Licence: wxWindows licence
  9. */
  10. /*
  11. This is a C file, not C++ one, do not use C++ comments here!
  12. */
  13. #ifndef _WX_DLIMPEXP_H_
  14. #define _WX_DLIMPEXP_H_
  15. #if defined(HAVE_VISIBILITY)
  16. # define WXEXPORT __attribute__ ((visibility("default")))
  17. # define WXIMPORT __attribute__ ((visibility("default")))
  18. #elif defined(__WINDOWS__)
  19. /*
  20. __declspec works in BC++ 5 and later, Watcom C++ 11.0 and later as well
  21. as VC++.
  22. */
  23. # if defined(__VISUALC__) || defined(__BORLANDC__) || defined(__WATCOMC__)
  24. # define WXEXPORT __declspec(dllexport)
  25. # define WXIMPORT __declspec(dllimport)
  26. /*
  27. While gcc also supports __declspec(dllexport), it creates unusably huge
  28. DLL files since gcc 4.5 (while taking horribly long amounts of time),
  29. see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43601. Because of this
  30. we rely on binutils auto export/import support which seems to work
  31. quite well for 4.5+.
  32. */
  33. # elif defined(__GNUC__) && !wxCHECK_GCC_VERSION(4, 5)
  34. /*
  35. __declspec could be used here too but let's use the native
  36. __attribute__ instead for clarity.
  37. */
  38. # define WXEXPORT __attribute__((dllexport))
  39. # define WXIMPORT __attribute__((dllimport))
  40. # endif
  41. #elif defined(__WXPM__)
  42. # if defined (__WATCOMC__)
  43. # define WXEXPORT __declspec(dllexport)
  44. /*
  45. __declspec(dllimport) prepends __imp to imported symbols. We do NOT
  46. want that!
  47. */
  48. # define WXIMPORT
  49. # elif defined(__EMX__)
  50. # define WXEXPORT
  51. # define WXIMPORT
  52. # elif (!(defined(__VISAGECPP__) && (__IBMCPP__ < 400 || __IBMC__ < 400 )))
  53. # define WXEXPORT _Export
  54. # define WXIMPORT _Export
  55. # endif
  56. #elif defined(__CYGWIN__)
  57. # define WXEXPORT __declspec(dllexport)
  58. # define WXIMPORT __declspec(dllimport)
  59. #endif
  60. /* for other platforms/compilers we don't anything */
  61. #ifndef WXEXPORT
  62. # define WXEXPORT
  63. # define WXIMPORT
  64. #endif
  65. /*
  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).
  69. However we have a problem because we need separate WXDLLIMPEXP versions for
  70. different libraries as, for example, wxString class should be dllexported
  71. when compiled in wxBase and dllimported otherwise, so we do define separate
  72. WXMAKING/USINGDLL_XYZ constants for each component XYZ.
  73. */
  74. #ifdef WXMAKINGDLL
  75. # if wxUSE_BASE
  76. # define WXMAKINGDLL_BASE
  77. # endif
  78. # define WXMAKINGDLL_NET
  79. # define WXMAKINGDLL_CORE
  80. # define WXMAKINGDLL_ADV
  81. # define WXMAKINGDLL_QA
  82. # define WXMAKINGDLL_HTML
  83. # define WXMAKINGDLL_GL
  84. # define WXMAKINGDLL_XML
  85. # define WXMAKINGDLL_XRC
  86. # define WXMAKINGDLL_AUI
  87. # define WXMAKINGDLL_PROPGRID
  88. # define WXMAKINGDLL_RIBBON
  89. # define WXMAKINGDLL_RICHTEXT
  90. # define WXMAKINGDLL_MEDIA
  91. # define WXMAKINGDLL_STC
  92. # define WXMAKINGDLL_WEBVIEW
  93. #endif /* WXMAKINGDLL */
  94. /*
  95. WXDLLIMPEXP_CORE maps to export declaration when building the DLL, to import
  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. # if defined(HAVE_VISIBILITY)
  102. # define WXDLLIMPEXP_INLINE_BASE WXEXPORT
  103. # else
  104. # define WXDLLIMPEXP_INLINE_BASE
  105. # endif
  106. #elif defined(WXUSINGDLL)
  107. # define WXDLLIMPEXP_BASE WXIMPORT
  108. # define WXDLLIMPEXP_DATA_BASE(type) WXIMPORT type
  109. # if defined(HAVE_VISIBILITY)
  110. # define WXDLLIMPEXP_INLINE_BASE WXIMPORT
  111. # else
  112. # define WXDLLIMPEXP_INLINE_BASE
  113. # endif
  114. #else /* not making nor using DLL */
  115. # define WXDLLIMPEXP_BASE
  116. # define WXDLLIMPEXP_DATA_BASE(type) type
  117. # define WXDLLIMPEXP_INLINE_BASE
  118. #endif
  119. #ifdef WXMAKINGDLL_NET
  120. # define WXDLLIMPEXP_NET WXEXPORT
  121. # define WXDLLIMPEXP_DATA_NET(type) WXEXPORT type
  122. #elif defined(WXUSINGDLL)
  123. # define WXDLLIMPEXP_NET WXIMPORT
  124. # define WXDLLIMPEXP_DATA_NET(type) WXIMPORT type
  125. #else /* not making nor using DLL */
  126. # define WXDLLIMPEXP_NET
  127. # define WXDLLIMPEXP_DATA_NET(type) type
  128. #endif
  129. #ifdef WXMAKINGDLL_CORE
  130. # define WXDLLIMPEXP_CORE WXEXPORT
  131. # define WXDLLIMPEXP_DATA_CORE(type) WXEXPORT type
  132. # if defined(HAVE_VISIBILITY)
  133. # define WXDLLIMPEXP_INLINE_CORE WXEXPORT
  134. # else
  135. # define WXDLLIMPEXP_INLINE_CORE
  136. # endif
  137. #elif defined(WXUSINGDLL)
  138. # define WXDLLIMPEXP_CORE WXIMPORT
  139. # define WXDLLIMPEXP_DATA_CORE(type) WXIMPORT type
  140. # if defined(HAVE_VISIBILITY)
  141. # define WXDLLIMPEXP_INLINE_CORE WXIMPORT
  142. # else
  143. # define WXDLLIMPEXP_INLINE_CORE
  144. # endif
  145. #else /* not making nor using DLL */
  146. # define WXDLLIMPEXP_CORE
  147. # define WXDLLIMPEXP_DATA_CORE(type) type
  148. # define WXDLLIMPEXP_INLINE_CORE
  149. #endif
  150. #ifdef WXMAKINGDLL_ADV
  151. # define WXDLLIMPEXP_ADV WXEXPORT
  152. # define WXDLLIMPEXP_DATA_ADV(type) WXEXPORT type
  153. #elif defined(WXUSINGDLL)
  154. # define WXDLLIMPEXP_ADV WXIMPORT
  155. # define WXDLLIMPEXP_DATA_ADV(type) WXIMPORT type
  156. #else /* not making nor using DLL */
  157. # define WXDLLIMPEXP_ADV
  158. # define WXDLLIMPEXP_DATA_ADV(type) type
  159. #endif
  160. #ifdef WXMAKINGDLL_QA
  161. # define WXDLLIMPEXP_QA WXEXPORT
  162. # define WXDLLIMPEXP_DATA_QA(type) WXEXPORT type
  163. #elif defined(WXUSINGDLL)
  164. # define WXDLLIMPEXP_QA WXIMPORT
  165. # define WXDLLIMPEXP_DATA_QA(type) WXIMPORT type
  166. #else /* not making nor using DLL */
  167. # define WXDLLIMPEXP_QA
  168. # define WXDLLIMPEXP_DATA_QA(type) type
  169. #endif
  170. #ifdef WXMAKINGDLL_HTML
  171. # define WXDLLIMPEXP_HTML WXEXPORT
  172. # define WXDLLIMPEXP_DATA_HTML(type) WXEXPORT type
  173. #elif defined(WXUSINGDLL)
  174. # define WXDLLIMPEXP_HTML WXIMPORT
  175. # define WXDLLIMPEXP_DATA_HTML(type) WXIMPORT type
  176. #else /* not making nor using DLL */
  177. # define WXDLLIMPEXP_HTML
  178. # define WXDLLIMPEXP_DATA_HTML(type) type
  179. #endif
  180. #ifdef WXMAKINGDLL_GL
  181. # define WXDLLIMPEXP_GL WXEXPORT
  182. #elif defined(WXUSINGDLL)
  183. # define WXDLLIMPEXP_GL WXIMPORT
  184. #else /* not making nor using DLL */
  185. # define WXDLLIMPEXP_GL
  186. #endif
  187. #ifdef WXMAKINGDLL_XML
  188. # define WXDLLIMPEXP_XML WXEXPORT
  189. #elif defined(WXUSINGDLL)
  190. # define WXDLLIMPEXP_XML WXIMPORT
  191. #else /* not making nor using DLL */
  192. # define WXDLLIMPEXP_XML
  193. #endif
  194. #ifdef WXMAKINGDLL_XRC
  195. # define WXDLLIMPEXP_XRC WXEXPORT
  196. #elif defined(WXUSINGDLL)
  197. # define WXDLLIMPEXP_XRC WXIMPORT
  198. #else /* not making nor using DLL */
  199. # define WXDLLIMPEXP_XRC
  200. #endif
  201. #ifdef WXMAKINGDLL_AUI
  202. # define WXDLLIMPEXP_AUI WXEXPORT
  203. #elif defined(WXUSINGDLL)
  204. # define WXDLLIMPEXP_AUI WXIMPORT
  205. #else /* not making nor using DLL */
  206. # define WXDLLIMPEXP_AUI
  207. #endif
  208. #ifdef WXMAKINGDLL_PROPGRID
  209. # define WXDLLIMPEXP_PROPGRID WXEXPORT
  210. # define WXDLLIMPEXP_DATA_PROPGRID(type) WXEXPORT type
  211. #elif defined(WXUSINGDLL)
  212. # define WXDLLIMPEXP_PROPGRID WXIMPORT
  213. # define WXDLLIMPEXP_DATA_PROPGRID(type) WXIMPORT type
  214. #else /* not making nor using DLL */
  215. # define WXDLLIMPEXP_PROPGRID
  216. # define WXDLLIMPEXP_DATA_PROPGRID(type) type
  217. #endif
  218. #ifdef WXMAKINGDLL_RIBBON
  219. # define WXDLLIMPEXP_RIBBON WXEXPORT
  220. #elif defined(WXUSINGDLL)
  221. # define WXDLLIMPEXP_RIBBON WXIMPORT
  222. #else /* not making nor using DLL */
  223. # define WXDLLIMPEXP_RIBBON
  224. #endif
  225. #ifdef WXMAKINGDLL_RICHTEXT
  226. # define WXDLLIMPEXP_RICHTEXT WXEXPORT
  227. #elif defined(WXUSINGDLL)
  228. # define WXDLLIMPEXP_RICHTEXT WXIMPORT
  229. #else /* not making nor using DLL */
  230. # define WXDLLIMPEXP_RICHTEXT
  231. #endif
  232. #ifdef WXMAKINGDLL_MEDIA
  233. # define WXDLLIMPEXP_MEDIA WXEXPORT
  234. #elif defined(WXUSINGDLL)
  235. # define WXDLLIMPEXP_MEDIA WXIMPORT
  236. #else /* not making nor using DLL */
  237. # define WXDLLIMPEXP_MEDIA
  238. #endif
  239. #ifdef WXMAKINGDLL_STC
  240. # define WXDLLIMPEXP_STC WXEXPORT
  241. # define WXDLLIMPEXP_DATA_STC(type) WXEXPORT type
  242. #elif defined(WXUSINGDLL)
  243. # define WXDLLIMPEXP_STC WXIMPORT
  244. # define WXDLLIMPEXP_DATA_STC(type) WXIMPORT type
  245. #else /* not making nor using DLL */
  246. # define WXDLLIMPEXP_STC
  247. # define WXDLLIMPEXP_DATA_STC(type) type
  248. #endif
  249. #ifdef WXMAKINGDLL_WEBVIEW
  250. # define WXDLLIMPEXP_WEBVIEW WXEXPORT
  251. # define WXDLLIMPEXP_DATA_WEBVIEW(type) WXEXPORT type
  252. #elif defined(WXUSINGDLL)
  253. # define WXDLLIMPEXP_WEBVIEW WXIMPORT
  254. # define WXDLLIMPEXP_DATA_WEBVIEW(type) WXIMPORT type
  255. #else /* not making nor using DLL */
  256. # define WXDLLIMPEXP_WEBVIEW
  257. # define WXDLLIMPEXP_DATA_WEBVIEW(type) type
  258. #endif
  259. /*
  260. GCC warns about using __attribute__ (and also __declspec in mingw32 case) on
  261. forward declarations while MSVC complains about forward declarations without
  262. __declspec for the classes later declared with it, so we need a separate set
  263. of macros for forward declarations to hide this difference:
  264. */
  265. #if defined(HAVE_VISIBILITY) || (defined(__WINDOWS__) && defined(__GNUC__))
  266. #define WXDLLIMPEXP_FWD_BASE
  267. #define WXDLLIMPEXP_FWD_NET
  268. #define WXDLLIMPEXP_FWD_CORE
  269. #define WXDLLIMPEXP_FWD_ADV
  270. #define WXDLLIMPEXP_FWD_QA
  271. #define WXDLLIMPEXP_FWD_HTML
  272. #define WXDLLIMPEXP_FWD_GL
  273. #define WXDLLIMPEXP_FWD_XML
  274. #define WXDLLIMPEXP_FWD_XRC
  275. #define WXDLLIMPEXP_FWD_AUI
  276. #define WXDLLIMPEXP_FWD_PROPGRID
  277. #define WXDLLIMPEXP_FWD_RIBBON
  278. #define WXDLLIMPEXP_FWD_RICHTEXT
  279. #define WXDLLIMPEXP_FWD_MEDIA
  280. #define WXDLLIMPEXP_FWD_STC
  281. #define WXDLLIMPEXP_FWD_WEBVIEW
  282. #else
  283. #define WXDLLIMPEXP_FWD_BASE WXDLLIMPEXP_BASE
  284. #define WXDLLIMPEXP_FWD_NET WXDLLIMPEXP_NET
  285. #define WXDLLIMPEXP_FWD_CORE WXDLLIMPEXP_CORE
  286. #define WXDLLIMPEXP_FWD_ADV WXDLLIMPEXP_ADV
  287. #define WXDLLIMPEXP_FWD_QA WXDLLIMPEXP_QA
  288. #define WXDLLIMPEXP_FWD_HTML WXDLLIMPEXP_HTML
  289. #define WXDLLIMPEXP_FWD_GL WXDLLIMPEXP_GL
  290. #define WXDLLIMPEXP_FWD_XML WXDLLIMPEXP_XML
  291. #define WXDLLIMPEXP_FWD_XRC WXDLLIMPEXP_XRC
  292. #define WXDLLIMPEXP_FWD_AUI WXDLLIMPEXP_AUI
  293. #define WXDLLIMPEXP_FWD_PROPGRID WXDLLIMPEXP_PROPGRID
  294. #define WXDLLIMPEXP_FWD_RIBBON WXDLLIMPEXP_RIBBON
  295. #define WXDLLIMPEXP_FWD_RICHTEXT WXDLLIMPEXP_RICHTEXT
  296. #define WXDLLIMPEXP_FWD_MEDIA WXDLLIMPEXP_MEDIA
  297. #define WXDLLIMPEXP_FWD_STC WXDLLIMPEXP_STC
  298. #define WXDLLIMPEXP_FWD_WEBVIEW WXDLLIMPEXP_WEBVIEW
  299. #endif
  300. /* for backwards compatibility, define suffix-less versions too */
  301. #define WXDLLEXPORT WXDLLIMPEXP_CORE
  302. #define WXDLLEXPORT_DATA WXDLLIMPEXP_DATA_CORE
  303. /*
  304. MSVC up to 6.0 needs to be explicitly told to export template instantiations
  305. used by the DLL clients, use this macro to do it like this:
  306. template <typename T> class Foo { ... };
  307. WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( Foo<int> )
  308. (notice that currently we only need this for wxBase and wxCore libraries)
  309. */
  310. #if defined(__VISUALC__) && (__VISUALC__ <= 1200)
  311. #ifdef WXMAKINGDLL_BASE
  312. #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl) \
  313. template class WXDLLIMPEXP_BASE decl;
  314. #define WXDLLIMPEXP_TEMPLATE_INSTANCE_CORE(decl) \
  315. template class WXDLLIMPEXP_CORE decl;
  316. #else
  317. /*
  318. We need to disable this warning when using this macro, as
  319. recommended by Microsoft itself:
  320. http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b168958
  321. */
  322. #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;
  327. #endif
  328. #else /* not VC <= 6 */
  329. #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl)
  330. #define WXDLLIMPEXP_TEMPLATE_INSTANCE_CORE(decl)
  331. #endif /* VC6/others */
  332. #endif /* _WX_DLIMPEXP_H_ */