[xsd-users] Compiling to multiple DLLs, duplicate symbols problem

Greg Carter greg at permedia.ca
Thu Feb 18 15:06:29 EST 2010


I think the problem is with generated code like:

namespace xml_schema
{
    template class GEOCOSMXMLBASE_SYMBOL_DECL 
::xsd::cxx::tree::simple_type< type >;
}

This seems to be in violation of C++ standard (section 14.7.3 para 2).  See
http://gcc.gnu.org/ml/gcc-help/2006-03/msg00195.html
and follow the "follow-up" links.

I think this is related to the --export-maps/--import-maps option.  Do 
you see any way around this?  If I remove the 
--export-maps/--import-maps options and regenerate my code for a Linux 
build, will I still be able to separate the generated code into multiple 
shared libs (Linux)?

Thanks
Greg.

Greg Carter wrote:
> Hi Boris,
>
> I missed this when you first posted it, I will give it a try on 
> Windows. However I am having a problem when I try to compile on Linux 
> which I think is related to this, or at least to the exporting of XSD 
> base template symbols.
>
> I'm trying to build the equivalent of my geocosmxmllibbasecpp.dll on 
> Linux as a shared lib. When I try to build I get this error
> explicit instantiation of ‘class 
> xsd::cxx::tree::simple_type<xsd::cxx::tree::_type>’ in namespace 
> ‘xml_schema’ (which does not enclose namespace ‘xsd::cxx::tree’)
>
> At each point in my XSDBaseXmlSchema.hxx where a line like:
>
> template class GEOCOSMXMLBASE_SYMBOL_DECL 
> ::xsd::cxx::tree::simple_type< type >;
>
> occurs.
>
> For my linux build GEOCOSMXMLBASE_SYMBOL_DECL is defined as nothing:
> #define GEOCOSMXMLBASE_SYMBOL_DECL
>
> I'm on centos 5.4,
> g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)
> xsd version xsd-3.3.0.b1-i686-linux-gnu, although the files were 
> generated (including XSDBaseXmlSchema.hxx) on Windows using xsd 
> version xsd-3.3.0.b1-i686-windows.
>
> I'm using Eclipse to build, the exact command is:
> make all
> Building file: ../xmlschema/gencode/cpp/DistributionCorrelationSchema.cxx
> Invoking: GCC C++ Compiler
> g++ -DGEOCOSMXMLLIBBASECPP_EXPORTS=1 
> -I"/opt/xsd-3.3.0.b1-i686-linux-gnu/libxsd" 
> -I"/opt/xerces-c-3.1.0-x86-linux-gcc-3.4/include" 
> -I"/mnt/src/geocosm/geocosmxmllibbasecpp" 
> -I"/mnt/src/geocosm/xmlschema/gencode/cpp" -O0 -g3 -Wall -c 
> -fmessage-length=0 -MMD -MP 
> -MF"xmlschema/gencode/cpp/DistributionCorrelationSchema.d" 
> -MT"xmlschema/gencode/cpp/DistributionCorrelationSchema.d" 
> -o"xmlschema/gencode/cpp/DistributionCorrelationSchema.o" 
> "../xmlschema/gencode/cpp/DistributionCorrelationSchema.cxx"
>
> ../xmlschema/gencode/cpp/XSDBaseXmlSchema.hxx:82: error: explicit 
> instantiation of ‘class 
> xsd::cxx::tree::simple_type<xsd::cxx::tree::_type>’ in namespace 
> ‘xml_schema’ (which does not enclose namespace ‘xsd::cxx::tree’)
> ../xmlschema/gencode/cpp/XSDBaseXmlSchema.hxx:126: error: explicit 
> instantiation of ‘class xsd::cxx::tree::string<char, 
> xsd::cxx::tree::simple_type<xsd::cxx::tree::_type> >’ in namespace 
> ‘xml_schema’ (which does not enclose namespace ‘xsd::cxx::tree’)
> <48 more errors all in XSDBaseXmlSchema.hxx>
>
> Any ideas?
>
> Boris Kolpackov wrote:
>> Hi Greg,
>>
>>   Based on this understanding I was able to work around the problem
>> in your case by adding the following code at the end of exportxml.h:
>>
>> #include <xsd/cxx/tree/containers.hxx>
>>
>> namespace xsd
>> {
>>   namespace cxx
>>   {
>>     namespace tree
>>     {
>>       template class __declspec(dllimport) sequence<int>;
>>     }
>>   }
>> }
>>
>>   
>



More information about the xsd-users mailing list