]> git.saurik.com Git - wxWidgets.git/commitdiff
Don't use __declspec(dllexport) for MinGW gcc 4.5 and later.
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 17 Jun 2011 21:53:26 +0000 (21:53 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 17 Jun 2011 21:53:26 +0000 (21:53 +0000)
Due to the changes in gcc 4.5, copies of dllexported inline functions are now
generated in all object files including their declarations, increasing their
sizes tenfold, and they are also now instantiated in the DLL itself increasing
its size fourfold. Moreover, linking such a gigantic DLL requires inordinate
amounts of memory and takes a very long time, see some statistics at
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43601.

To avoid all these problems, don't use dllexport at all any more but rely on
binutils support for auto export/import which seems to work fine and results
in much smaller DLLs which are created much faster.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67971 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dlimpexp.h

index 13231ed6fd33e746cbc070f566291e03e3204bc2..d6c7522d844633025c070e31d5e133f48d7248c0 100644 (file)
 #elif defined(__WINDOWS__)
     /*
        __declspec works in BC++ 5 and later, Watcom C++ 11.0 and later as well
-       as VC++ and gcc
+       as VC++.
      */
-#    if defined(__VISUALC__) || defined(__BORLANDC__) || defined(__GNUC__) || defined(__WATCOMC__)
+#    if defined(__VISUALC__) || defined(__BORLANDC__) || defined(__WATCOMC__)
 #        define WXEXPORT __declspec(dllexport)
 #        define WXIMPORT __declspec(dllimport)
-#    else /* compiler doesn't support __declspec() */
-#        define WXEXPORT
-#        define WXIMPORT
+    /*
+        While gcc also supports __declspec(dllexport), it creates unusably huge
+        DLL files since gcc 4.5 (while taking horribly long amounts of time),
+        see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43601. Because of this
+        we rely on binutils auto export/import support which seems to work
+        quite well for 4.5+.
+     */
+#    elif defined(__GNUC__) && !wxCHECK_GCC_VERSION(4, 5)
+        /*
+            __declspec could be used here too but let's use the native
+            __attribute__ instead for clarity.
+        */
+#       define WXEXPORT __attribute__((dllexport))
+#       define WXIMPORT __attribute__((dllimport))
 #    endif
 #elif defined(__WXPM__)
 #    if defined (__WATCOMC__)