[flac-dev] make dllimport/dllexport attributes work with mingw (and others)

Ozkan Sezer sezeroz at gmail.com
Sat May 24 14:28:22 PDT 2014


On 5/24/14, lvqcl <lvqcl.mail at gmail.com> wrote:
> Ozkan Sezer <sezeroz at gmail.com> писал(а) в своём письме Sat, 24 May 2014
> 10:16:15 +0400:
>
>> - changes the _MSC_VER condition to universally _WIN32: MSVC, as well
>>   as GCC supports this.
>
> MSYS/MinGW 4.8.3, 4.9.0 can't compile code from git after this patch:
>
> format.c:47:22: error: variable 'FLAC__VERSION_STRING' definition is marked
> dllimport
>   FLAC_API const char *FLAC__VERSION_STRING = VERSION;
>                        ^
> format.c:47:22: warning: 'FLAC__VERSION_STRING' redeclared without dllimport
> attribute: previous dllimport ignored [-Wattributes]
> format.c:49:22: error: variable 'FLAC__VENDOR_STRING' definition is marked
> dllimport
>   FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC " VERSION "
> 20130526";
>                        ^
> format.c:49:22: warning: 'FLAC__VENDOR_STRING' redeclared without dllimport
> attribute: previous dllimport ignored [-Wattributes]
>
> ...
> ...
>
>
> FLAC_API_EXPORTS macro is defined in libFLAC_dynamic.vcproj,
> FLACPP_API_EXPORTS macro is defined in libFLAC++_dynamic.vcproj,
> but MinGW/GCC makefiles don't define them anywhere.

My apologies, obviously sent an old testing patch. Correct one is
attached (declspec2.diff). Compilation tested using MinGW (gcc-3.4.5,
binutils-2.20), and MinGW-w64 (gcc-4.5.4, binutils-2.21.90.)

--
O.S.
-------------- next part --------------
diff --git a/include/FLAC/export.h b/include/FLAC/export.h
index 2232b41..185c282 100644
--- a/include/FLAC/export.h
+++ b/include/FLAC/export.h
@@ -59,11 +59,11 @@
 #if defined(FLAC__NO_DLL)
 #define FLAC_API
 
-#elif defined(_MSC_VER)
-#ifdef FLAC_API_EXPORTS
-#define	FLAC_API	_declspec(dllexport)
+#elif defined(_WIN32)
+#if defined(FLAC_API_EXPORTS) || defined(DLL_EXPORT)
+#define FLAC_API __declspec(dllexport)
 #else
-#define FLAC_API	_declspec(dllimport)
+#define FLAC_API __declspec(dllimport)
 #endif
 
 #elif defined(FLAC__USE_VISIBILITY_ATTR)
diff --git a/include/FLAC++/export.h b/include/FLAC++/export.h
index 11c09e6..91649a5 100644
--- a/include/FLAC++/export.h
+++ b/include/FLAC++/export.h
@@ -59,11 +59,11 @@
 #if defined(FLAC__NO_DLL)
 #define FLACPP_API
 
-#elif defined(_MSC_VER)
-#ifdef FLACPP_API_EXPORTS
-#define	FLACPP_API	_declspec(dllexport)
+#elif defined(_WIN32)
+#if defined(FLACPP_API_EXPORTS) || defined(DLL_EXPORT)
+#define FLACPP_API __declspec(dllexport)
 #else
-#define FLACPP_API	_declspec(dllimport)
+#define FLACPP_API __declspec(dllimport)
 #endif
 
 #elif defined(FLAC__USE_VISIBILITY_ATTR)
diff --git a/src/flac/Makefile.am b/src/flac/Makefile.am
index 389215e..a4929ab 100644
--- a/src/flac/Makefile.am
+++ b/src/flac/Makefile.am
@@ -44,6 +44,9 @@ flac_SOURCES = \
 	utils.h \
 	vorbiscomment.h
 
+if OS_IS_WINDOWS
+win_utf8_lib = $(top_builddir)/src/share/win_utf8_io/libwin_utf8_io.la
+endif
 flac_LDADD = \
 	$(top_builddir)/src/share/utf8/libutf8.la \
 	$(top_builddir)/src/share/grabbag/libgrabbag.la \
@@ -51,7 +54,7 @@ flac_LDADD = \
 	$(top_builddir)/src/share/replaygain_analysis/libreplaygain_analysis.la \
 	$(top_builddir)/src/share/replaygain_synthesis/libreplaygain_synthesis.la \
 	$(top_builddir)/src/libFLAC/libFLAC.la \
-	@LIBICONV@ \
+	$(win_utf8_lib) @LIBICONV@ \
 	-lm
 
 CLEANFILES = flac.exe
diff --git a/src/metaflac/Makefile.am b/src/metaflac/Makefile.am
index d6e76e8..94fda50 100644
--- a/src/metaflac/Makefile.am
+++ b/src/metaflac/Makefile.am
@@ -42,12 +42,15 @@ metaflac_SOURCES = \
 	utils.h
 metaflac_LDFLAGS = $(AM_LDFLAGS)
 
+if OS_IS_WINDOWS
+win_utf8_lib = $(top_builddir)/src/share/win_utf8_io/libwin_utf8_io.la
+endif
 metaflac_LDADD = \
 	$(top_builddir)/src/share/grabbag/libgrabbag.la \
 	$(top_builddir)/src/share/replaygain_analysis/libreplaygain_analysis.la \
 	$(top_builddir)/src/share/getopt/libgetopt.la \
 	$(top_builddir)/src/share/utf8/libutf8.la \
 	$(top_builddir)/src/libFLAC/libFLAC.la \
-	@LIBICONV@
+	$(win_utf8_lib) @LIBICONV@
 
 CLEANFILES = metaflac.exe
diff --git a/src/test_grabbag/cuesheet/Makefile.am b/src/test_grabbag/cuesheet/Makefile.am
index a7fc5c5..134afb2 100644
--- a/src/test_grabbag/cuesheet/Makefile.am
+++ b/src/test_grabbag/cuesheet/Makefile.am
@@ -24,8 +24,13 @@ AM_CPPFLAGS = -I$(top_builddir) -I$(srcdir)/include -I$(top_srcdir)/include
 noinst_PROGRAMS = test_cuesheet
 test_cuesheet_SOURCES = \
 	main.c
+
+if OS_IS_WINDOWS
+win_utf8_lib = $(top_builddir)/src/share/win_utf8_io/libwin_utf8_io.la
+endif
 test_cuesheet_LDADD = \
 	$(top_builddir)/src/share/grabbag/libgrabbag.la \
+	$(win_utf8_lib) \
 	$(top_builddir)/src/share/replaygain_analysis/libreplaygain_analysis.la \
 	$(top_builddir)/src/libFLAC/libFLAC.la
 
diff --git a/src/test_grabbag/picture/Makefile.am b/src/test_grabbag/picture/Makefile.am
index 677fe5c..83af1e8 100644
--- a/src/test_grabbag/picture/Makefile.am
+++ b/src/test_grabbag/picture/Makefile.am
@@ -25,8 +25,12 @@ noinst_PROGRAMS = test_picture
 test_picture_SOURCES = \
 	main.c
 
+if OS_IS_WINDOWS
+win_utf8_lib = $(top_builddir)/src/share/win_utf8_io/libwin_utf8_io.la
+endif
 test_picture_LDADD = \
 	$(top_builddir)/src/share/grabbag/libgrabbag.la \
+	$(win_utf8_lib) \
 	$(top_builddir)/src/libFLAC/libFLAC.la
 
 CLEANFILES = test_picture.exe
diff --git a/src/test_libFLAC++/Makefile.am b/src/test_libFLAC++/Makefile.am
index 281557d..98eee9e 100644
--- a/src/test_libFLAC++/Makefile.am
+++ b/src/test_libFLAC++/Makefile.am
@@ -22,13 +22,17 @@ EXTRA_DIST = \
 
 AM_CPPFLAGS = -I$(top_builddir) -I$(srcdir)/include -I$(top_srcdir)/include
 noinst_PROGRAMS = test_libFLAC++
+
+if OS_IS_WINDOWS
+win_utf8_lib = $(top_builddir)/src/share/win_utf8_io/libwin_utf8_io.la
+endif
 test_libFLAC___LDADD = \
 	$(top_builddir)/src/share/grabbag/libgrabbag.la \
 	$(top_builddir)/src/share/replaygain_analysis/libreplaygain_analysis.la \
 	$(top_builddir)/src/test_libs_common/libtest_libs_common.la \
 	$(top_builddir)/src/libFLAC++/libFLAC++.la \
 	$(top_builddir)/src/libFLAC/libFLAC.la \
-	@OGG_LIBS@ \
+	$(win_utf8_lib) @OGG_LIBS@ \
 	-lm
 
 test_libFLAC___SOURCES = \
diff --git a/src/test_libFLAC/Makefile.am b/src/test_libFLAC/Makefile.am
index 407c8ea..5c3d4f1 100644
--- a/src/test_libFLAC/Makefile.am
+++ b/src/test_libFLAC/Makefile.am
@@ -25,6 +25,7 @@ AM_CPPFLAGS = -I$(top_builddir) -I$(srcdir)/include -I$(top_srcdir)/include -I$(
 noinst_PROGRAMS = test_libFLAC
 
 if OS_IS_WINDOWS
+AM_CPPFLAGS += -DFLAC__NO_DLL
 win_utf8_lib = $(top_builddir)/src/share/win_utf8_io/libwin_utf8_io.la
 endif
 
diff --git a/src/test_seeking/Makefile.am b/src/test_seeking/Makefile.am
index 87ddb36..bb7a564 100644
--- a/src/test_seeking/Makefile.am
+++ b/src/test_seeking/Makefile.am
@@ -25,8 +25,13 @@ AM_CFLAGS = @OGG_CFLAGS@
 AM_CPPFLAGS = -I$(top_builddir) -I$(srcdir)/include -I$(top_srcdir)/include
 
 noinst_PROGRAMS = test_seeking
+
+if OS_IS_WINDOWS
+win_utf8_lib = $(top_builddir)/src/share/win_utf8_io/libwin_utf8_io.la
+endif
+
 test_seeking_LDADD = \
-	$(top_builddir)/src/libFLAC/libFLAC.la
+	$(win_utf8_lib) $(top_builddir)/src/libFLAC/libFLAC.la
 
 test_seeking_SOURCES = \
 	main.c


More information about the flac-dev mailing list