Skip to content
  • Konstantinos Tsanaktsidis's avatar
    Fix libmod_plugin undefined __imp_ symbols building for win32 · 298616dd
    Konstantinos Tsanaktsidis authored and Jean-Baptiste Kempf's avatar Jean-Baptiste Kempf committed
    
    
    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: default avatarJean-Baptiste Kempf <jb@videolan.org>
    298616dd