Boost logo

Boost Users :

Subject: Re: [Boost-users] [serialization] mingw Deriving from boost::archive::xml_iarchive
From: Ken (ken.appleby_at_[hidden])
Date: 2012-06-23 10:14:53


On 23/06/2012 14:09, Jürgen Hunold wrote:
> Hi Ken,
>
> On Saturday, 23. June 2012 13:51:52 Ken wrote:
>> In porting from 1_41 to 1_49 on mingw this no longer links because the
>> boost::archive::basic_xml_grammar<char> class's symbols are no longer
>> exported from the serialization library.
>
> This sounds odd. Are you sure you are setting BOOST_ALL_DYN_LINK and/or
> BOOST_SERIALIZATION_DYN_LINK during compilation?
> The export/import magic looks fine to me.
>
> And please provide a compilable testcase. There are flags and #defines which
> might trigger this behaviour.
>
> Yours,
>
> Jürgen

Thanks Jürgen. No, we are not setting BOOST_SERIALIZATION_DYN_LINK.
Where should that be defined?

A minimal test case is below.

The evidence I was using, maybe erroneously, to claim that
boost::archive::basic_xml_grammar<char> symbols are not exported is that

a) nm stage/lib/libboost_serialization-mgw44-1_49.dll.a | grep grammar
produces nothing.

b) The file boost/archive/impl/basic_xml_grammar.hpp contains
declarations only. The implementation is defined in
libs/serialization/src/basic_xml_grammar.ipp and
libs/serialization/src/xml_grammar.cpp. Unlike the other serialization
classes, the code does not use BOOST_ARCHIVE_DECL or equivalent to
export the symbols.

Regards,

Ken

===================================
xmlia.hpp

# if ! defined __xmliarchive_h_
# define __xmliarchive_h_

#include <boost/archive/xml_iarchive.hpp>

class XmlInputArchive :
     public boost::archive::xml_iarchive_impl< XmlInputArchive >,
     public boost::archive::detail::shared_ptr_helper
{
     typedef boost::archive::xml_iarchive_impl< XmlInputArchive > Base;

public:
     XmlInputArchive( std::istream& is, unsigned int flags = 0 );

     void load_start( const char * name );
     void load_end( const char * name );
};

BOOST_SERIALIZATION_REGISTER_ARCHIVE( XmlInputArchive )

# endif

=======================================
xmlia.cpp

#include "xmlia.hpp"

#include <boost/archive/impl/basic_xml_iarchive.ipp>
#include <boost/archive/impl/xml_iarchive_impl.ipp>

XmlInputArchive::XmlInputArchive( std::istream & is, unsigned int flags )
     : boost::archive::xml_iarchive_impl< XmlInputArchive >( is, flags )
{
}

void XmlInputArchive::load_start( const char * name )
{
}

void XmlInputArchive::load_end( const char * name )
{
}
=========================================

Compiled and linked like this:

g++ -c -D__STDC_CONSTANT_MACROS -I. -O3 -frtti -fexceptions -mthreads
-Wall -Wno-non-virtual-dtor -Wno-ctor-dtor-privacy -Wno-strict-aliasing
-DUNICODE -I'c:/Boost/boost_1_49_0' -o release/xmlia.o xmlia.cpp

g++ -enable-stdcall-fixup -Wl,-enable-auto-import
-Wl,-enable-runtime-pseudo-reloc -Wl,-s -shared -export-all-symbols
-mthreads -Wl -Wl,--out-implib,release/libarchive_r.a
-orelease/archive_r.dll release/xmlia.o
-Lc:/Boost/boost_1_49_0/stage/lib -lboost_serialization-mgw44-1_49

g++ is from the Qt mingw toolkit c:/Qt/2010.05/mingw/bin/g++
g++ --version => g++.exe (GCC) 4.4.0


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net