Xerces-C and GSL: conflicting Macro "DLL_EXPORT" on Windows
-----------------------------------------------------------
Key: XERCESC-1849
URL: https://issues.apache.org/jira/browse/XERCESC-1849
Project: Xerces-C++
Issue Type: Bug
Components: Build
Affects Versions: 3.0.1
Environment: Visual Studio 2008, Vista x64 (testing system)
- this bug should affect all MSVC builds
Reporter: --
When using XERCES 3.0 and GSL (here 1.8 - but 1.11 still has the same issue) a
MACRO conflict will occur, when using Xerces' DLL in a project which at the
same time uses GSL dlls.
The conflicting Macro is "DLL_EXPORT". In gsl-1.8\include\gsl\gsl_types.h you
will find:
#ifdef WIN32
# ifdef GSL_DLL
# ifdef DLL_EXPORT
# define GSL_VAR extern __declspec(dllexport)
# define GSL_EXPORT __declspec(dllexport)
# else
# define GSL_VAR extern __declspec(dllimport)
# define GSL_EXPORT __declspec(dllimport)
# endif
# else
# define GSL_VAR extern
# define GSL_EXPORT
# endif
#else
# define GSL_VAR extern
# define GSL_EXPORT
#endif
In XERCES' xerces-c-3.0.0\src\xercesc\util\Xerces_autoconf_config.msvc.hpp
#ifdef XERCES_STATIC_LIBRARY
#define XERCES_PLATFORM_EXPORT
#define XERCES_PLATFORM_IMPORT
#else
#define XERCES_PLATFORM_EXPORT __declspec(dllexport)
#define XERCES_PLATFORM_IMPORT __declspec(dllimport)
#ifndef OPENMS_XERCESDLL
#define DLL_EXPORT
#endif
#endif
and xerces-c-3.0.0\src\xercesc\util\XercesDefs.hpp
#if defined(DLL_EXPORT)
#if defined(XERCES_BUILDING_LIBRARY)
#define XMLUTIL_EXPORT XERCES_PLATFORM_EXPORT
#define XMLPARSER_EXPORT XERCES_PLATFORM_EXPORT
#define SAX_EXPORT XERCES_PLATFORM_EXPORT
#define SAX2_EXPORT XERCES_PLATFORM_EXPORT
#define CDOM_EXPORT XERCES_PLATFORM_EXPORT
#define PARSERS_EXPORT XERCES_PLATFORM_EXPORT
#define VALIDATORS_EXPORT XERCES_PLATFORM_EXPORT
#define XINCLUDE_EXPORT XERCES_PLATFORM_EXPORT
#else
#define XMLUTIL_EXPORT XERCES_PLATFORM_IMPORT
#define XMLPARSER_EXPORT XERCES_PLATFORM_IMPORT
#define SAX_EXPORT XERCES_PLATFORM_IMPORT
#define SAX2_EXPORT XERCES_PLATFORM_IMPORT
#define CDOM_EXPORT XERCES_PLATFORM_IMPORT
#define PARSERS_EXPORT XERCES_PLATFORM_IMPORT
#define VALIDATORS_EXPORT XERCES_PLATFORM_IMPORT
#define XINCLUDE_EXPORT XERCES_PLATFORM_IMPORT
#endif
#if defined(XERCES_BUILDING_DEPRECATED_LIBRARY)
#define DEPRECATED_DOM_EXPORT XERCES_PLATFORM_EXPORT
#else
#define DEPRECATED_DOM_EXPORT XERCES_PLATFORM_IMPORT
#endif
#else
#define XMLUTIL_EXPORT
#define XMLPARSER_EXPORT
#define SAX_EXPORT
#define SAX2_EXPORT
#define CDOM_EXPORT
#define DEPRECATED_DOM_EXPORT
#define PARSERS_EXPORT
#define VALIDATORS_EXPORT
#define XINCLUDE_EXPORT
#endif
--
This leads to GSL defining
#define GSL_VAR extern __declspec(dllexport)
when it should be defining
# define GSL_VAR extern __declspec(dllimport)
and thus linking the third party app that uses XERCES and GSL will fail due to
wrong symbol names for GSL functions.
Why doesnt XERCES use something like XERCES_DLL which external projects need to
define if they are using XERCES headers?
DLL_EXPORT is quite a confusing name (especially when its also used for
importing).
Workaround (2 patches):
--- src\xercesc\util\Xerces_autoconf_config.msvc.hpp Do Jul 24 19:24:46 2008
+++ src\xercesc\util\Xerces_autoconf_config.msvc.hpp Do Jan 22 14:09:09 2009
@@ -100,8 +100,10 @@
#else
#define XERCES_PLATFORM_EXPORT __declspec(dllexport)
#define XERCES_PLATFORM_IMPORT __declspec(dllimport)
+#ifndef XERCES_DLL
#define DLL_EXPORT
#endif
+#endif
#define XERCES_MFC_SUPPORT
PATCH #2
--- src\xercesc\util\XercesDefs.hpp Do Jan 22 19:13:55 2009
+++ src\xercesc\util\XercesDefs.hpp Do Jan 22 19:13:22 2009
@@ -133,7 +133,7 @@
// The DLL_EXPORT flag should be defined on the command line during the build
of a DLL
// configure conspires to make this happen.
-#if defined(DLL_EXPORT)
+#if ((defined(DLL_EXPORT)) || (defined(XERCES_DLL)))
#if defined(XERCES_BUILDING_LIBRARY)
#define XMLUTIL_EXPORT XERCES_PLATFORM_EXPORT
#define XMLPARSER_EXPORT XERCES_PLATFORM_EXPORT
This should do the trick.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]