]> git.sesse.net Git - vlc/commit
Fix libmod_plugin undefined __imp_ symbols building for win32
authorKonstantinos Tsanaktsidis <kjtsanaktsidis@gmail.com>
Thu, 12 Jun 2014 13:34:46 +0000 (13:34 +0000)
committerJean-Baptiste Kempf <jb@videolan.org>
Sat, 14 Jun 2014 11:02:52 +0000 (13:02 +0200)
commit298616dd2bec030956000d1a5e115268e78091e8
treeeb9a1c5119eb4157ae76a2faa4d41ba5647db843
parent2391a63ea9719f76b8142ba5f2f5114d32c9a4cc
Fix libmod_plugin undefined __imp_ symbols building for win32

When building current HEAD of master for x86_64-w64-mingw32 against current
contribs, compilation fails at libmod_plugin due to undefined symbols of
the form __imp_ModPlug_*. This patch modifies libmodplug in contribs by
adding -DMODPLUG_STATIC to CFlags in the pkg-config file. A bug is also
fixed in the main build system to make sure the CFLAGS are picked up from
this pkg-config file.

This problem occurs because of the following code in
contrib/x86_64-w64-mingw32/include/libmodplug/modplug.h. This code is
present in libmodplug obtained from running "make fetch & make" in the
contribs directory, but not present in the prebuilt contribs obtained from
running "make prebuilt".

 #if defined(_WIN32) || defined(__CYGWIN__)
 # if defined(MODPLUG_BUILD) && defined(DLL_EXPORT)
 #   define MODPLUG_EXPORT __declspec(dllexport)
 # elif defined(MODPLUG_BUILD) || defined(MODPLUG_STATIC)
 #   define MODPLUG_EXPORT
 # else
 #   define MODPLUG_EXPORT __declspec(dllimport)
 # endif

When building for Windows, if MODPLUG_STATIC is not defined, MODPLUG_EXPORT
is defined as "__declspec(dllimport)". On Windows, dynamic symbols are
prefixed with "__imp_", so this causes GCC to adjust the symbol references
to the libmodplug functions accordingly.

This patch therefore adds a patch to contribs for libmodplug's pkg-config
file. It adds -DMODPLUG_STATIC to CFlags, so that when libmod_plugin is
building it will have the correct symbol names.

However, there is also a bug in the build system that needs to be fixed for
this to work. The configure script sets a CXXFLAGS_mod containing the
output of pkg-config for libmodplug, but not CFLAGS_mod. Additionally, the
Makefile.ac for libmod_plugin sets CXXFLAGS when in fact the relevant files
(mod.c) are plain C. Autotools therefore ignores these CXXFLAGS when
generating a makefile.

The solution is to add a macro to configure.ac to set CFLAGS_mod. This then
needs to be used in modules/demux/Makefile.am to populate
libmod_plugin_la_CFLAGS instead of libmod_plugin_la_CXXFLAGS (which gets
ignored).

Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
configure.ac
contrib/src/modplug/modplug-win32-static.patch [new file with mode: 0644]
contrib/src/modplug/rules.mak
modules/demux/Makefile.am