modules/media: Fix Visual Studio builds with older GLib
authorChun-wei Fan <fanchunwei@src.gnome.org>
Tue, 7 Mar 2023 06:27:06 +0000 (14:27 +0800)
committerChun-wei Fan <fanchunwei@src.gnome.org>
Tue, 7 Mar 2023 07:36:42 +0000 (15:36 +0800)
The current definitions of the g_io_module_*() symbols do not build on
Visual Studio when building against GLib earlier than 2.75.0 due to the
way how these symbols are decorated in the GLib headers, as Visual Studio
does not allow symbols that were previously marked with 'extern' (or so)
to be marked with anything that is symantically different later.

As a result, if we are using Visual Studio and glib-2.74.x or earlier,
override _GLIB_EXTERN as appropriate in the modules/media sources before
including the GIO headers.  This sadly, means that we need a
configure-time check as it would have been too late if we checked the
GLib version using G_VERSION_CHECK macro, as the GIO headers would have
been included already.

There are similar items in the print backends, but we will not attempt
to update these files as they are not meant to be built for Windows.

meson.build
modules/media/gtkffmediafile.c
modules/media/gtkgstmediafile.c

index 07912b124ef81d84bdf87a6de7b8c8e409617e66..3f05b7b9c610755c86df01d7212986c5c53641d2 100644 (file)
@@ -370,6 +370,13 @@ glib_dep       = dependency('glib-2.0', version: glib_req)
 gobject_dep    = dependency('gobject-2.0', version: glib_req)
 if os_win32
   giowin32_dep = dependency('gio-windows-2.0', version: glib_req, required: win32_enabled)
+  if giowin32_dep.version().version_compare('<2.75.0')
+    if cc.get_id() == 'msvc' and get_option('default_library') != 'static'
+      # Override _GLIB_EXTERN on Visual Studio for media modules for glib <= 2.74.x, so that we
+      # avoid error C2375 (redefinition; different linkage) when building the g_io_module_*() bits
+      cdata.set('MODULES_OVERRIDE_GLIB_EXTERN', true)
+    endif
+  endif
 endif
 if os_unix
   giounix_dep  = dependency('gio-unix-2.0', version: glib_req, required: false)
index 2839cb8174da649088f23f77d9682693622c43c4..0103e5bd1614894328b71f16d1ef3f52f6133de6 100644 (file)
 
 #include "config.h"
 
+/*
+ * Sadly, we need this to build on Visual Studio against glib-2.74.x or earlier,
+ * otherwise the build will fail when building the g_io_module_*() bits with error C2375
+ * (redefinition; different linkage).  This must be before including the Gio headers.
+ */
+#if defined (_MSC_VER) && defined (MODULES_OVERRIDE_GLIB_EXTERN)
+# define _GLIB_EXTERN __declspec(dllexport) extern
+#endif
+
 #include "gtkffmediafileprivate.h"
 
 #include <glib/gi18n-lib.h>
index 5487bb0571d20df4fc5c181ad4cdce57d1693592..7353539ef6621bb3d7b48aec167c8797e958b13e 100644 (file)
 
 #include "config.h"
 
+/*
+ * Sadly, we need this to build on Visual Studio against glib-2.74.x or earlier,
+ * otherwise the build will fail when building the g_io_module_*() bits with error C2375
+ * (redefinition; different linkage).  This must be before including the Gio headers.
+ */
+#if defined (_MSC_VER) && defined (MODULES_OVERRIDE_GLIB_EXTERN)
+# define _GLIB_EXTERN __declspec(dllexport) extern
+#endif
+
 #include "gtkgstmediafileprivate.h"
 #include "gtkgstpaintableprivate.h"