OK, try having WS_DLL_PUBLIC always say "extern". If *that* doesn't
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Wed, 3 Jul 2013 00:38:41 +0000 (00:38 +0000)
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Wed, 3 Jul 2013 00:38:41 +0000 (00:38 +0000)
work, because it can't be used with definitions, we'll probably have to
have separate macros for declarations and definitions, as I don't think
MSVC likes

int foo[];

in a header file but should be fine with

extern int foo[];

Add some more comments while we're at it; you are in a twisty little
maze of #ifdefs, all different.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@50332 f5534014-38df-0310-8fa8-9805f1628bb7

ws_symbol_export.h

index 14098ffea7d30aa24f8145c3e5f8fdde7fd6bd2e..e2c0e6f2fa6f9aadb32759410cb7b3b70cfab585 100644 (file)
 
 /* Originally copied from GCC Wiki at http://gcc.gnu.org/wiki/Visibility */
 #if defined _WIN32 || defined __CYGWIN__
+  /* Compiling for Windows, so we use the Windows DLL declarations. */
   #ifdef WS_BUILD_DLL
+    /*
+     * Building a library; for all definitions, we want dllexport, and
+     * (presumably so source from DLL and source from a program using the
+     * DLL can both include a header that declares APIs and exported data
+     * for the DLL), for declarations, either dllexport or dllimport will
+     * work (they mean the same thing for a declaration when building a DLL).
+     */
     #ifdef __GNUC__
-#define WS_DLL_PUBLIC __attribute__ ((dllexport))
+      /* GCC */
+#define WS_DLL_PUBLIC __attribute__ ((dllexport)) extern
+#define WS_DLL_PUBLIC_NOEXTERN __attribute__ ((dllexport))
     #else /* ! __GNUC__ */
-#define WS_DLL_PUBLIC __declspec(dllexport) /* Note: actually gcc seems to also support this syntax. */
+      /*
+       * Presumably MSVC.
+       * Note: actually gcc seems to also support this syntax.
+       */
+#define WS_DLL_PUBLIC __declspec(dllexport) extern
+#define WS_DLL_PUBLIC_NOEXTERN __declspec(dllexport)
     #endif /* __GNUC__ */
   #else /* WS_BUILD_DLL */
+    /*
+     * Building a program; we should only see declarations, not definitions,
+     * with WS_DLL_PUBLIC, and they all represent APIs or data imported
+     * from a DLL, so use dllimport.
+     *
+     * For functions, export shouldn't be necessary; for data, it might
+     * be necessary, e.g. if what's declared is an array whose size is
+     * not given in the declaration.
+     */
     #ifdef __GNUC__
-#define WS_DLL_PUBLIC __attribute__ ((dllimport))
+      /* GCC */
+#define WS_DLL_PUBLIC __attribute__ ((dllimport)) extern
+#define WS_DLL_PUBLIC_NOEXTERN __attribute__ ((dllimport))
     #elif ! (defined ENABLE_STATIC) /* ! __GNUC__ */
-#define WS_DLL_PUBLIC __declspec(dllimport) /* Note: actually gcc seems to also support this syntax. */
+      /*
+       * Presumably MSVC.
+       * Note: actually gcc seems to also support this syntax.
+       */
+#define WS_DLL_PUBLIC __declspec(dllimport) extern
+#define WS_DLL_PUBLIC_NOEXTERN __declspec(dllimport)
     #else /* ! __GNUC__  && ENABLE_STATIC */
-#define WS_DLL_PUBLIC
+      /* presumably MSVC */
+#define WS_DLL_PUBLIC extern
+#define WS_DLL_PUBLIC_NOEXTERN
     #endif /* __GNUC__ */
   #endif /* WS_BUILD_DLL */
-  #define WS_DLL_PUBLIC_NOEXTERN WS_DLL_PUBLIC
   #define WS_DLL_LOCAL
 #else /* defined _WIN32 || defined __CYGWIN__ */
+  /*
+   * Compiling for UN*X, where the dllimport and dllexport stuff
+   * is neither necessary nor supported; just specify the
+   * visibility if we have a compiler that claims compatibility
+   * with GCC 4 or later.
+   */
   #if __GNUC__ >= 4
 #define WS_DLL_PUBLIC __attribute__ ((visibility ("default"))) extern
 #define WS_DLL_PUBLIC_NOEXTERN __attribute__ ((visibility ("default")))