What?? I see you have a force_serialize_export() function, but how can you guys expect me to mangle my interfaces to get boost::serialization to do its job? So I have to now call arbitrary global functions all over the place? This is unreasonable and unacceptable. There has to be a better way!

On Fri, Apr 3, 2009 at 11:05 AM, Renaud Lepere <Renaud.Lepere@alma.fr> wrote:
Hello,

I had a similar problem, you must call a function in the compilation
unit if you put only the macros in the .cpp if will not work.

BOOST_CLASS_EXPORT(Curve2);
BOOST_CLASS_EXPORT(Line2);
BOOST_CLASS_EXPORT(Circle2);

/**
 * DO NOT REMOVE THIS FUNCTION
 * The C++ standard guarantees that all global objects contained
 * in a compilation unit (a CPP file) are initialized by the time
 * execution enters a function from that compilation unit. So, if
 * execution never enters a function from that compilation unit,
 * the compiler is allowed to deadstrip it.
 *
 * BOOST_CLASS_EXPORT is based upon global objects.
 */
void force_serialize_export();



________________________________

       De : boost-users-bounces@lists.boost.org [mailto:boost-users-bounces@lists.boost.org] De la part de Robert Dailey
       Envoyé : vendredi 3 avril 2009 16:56
       À : boost-users@lists.boost.org
       Objet : Re: [Boost-users] [serialization] Multiply defined symbol:guid_initializer


       But I've already tried that, as I said. It fails at runtime with an exception saying "unregistered void cast". I'll test it once more, but I don't expect different results.


       On Thu, Apr 2, 2009 at 10:07 PM, Robert Ramey <ramey@rrsd.com> wrote:


               Look at the pimple demo in the examples or test directory.  Basically you're getting some things defined twiice.

               Move the implementation of template< class Archive >
                       void serialize( Archive& archive, unsigned int version ) to the *.cpp
               and move
               BOOST_CLASS_EXPORT( rs::StaticText )

               to the *.cpp file as well.  compile that/those *.cpp files and include in the library. This is touched upon in the manual in the part describing EXPORT.

               Robert Ramey

                       "Robert Dailey" <rcdailey@gmail.com> wrote in message news:496954360904021720o79c9c17cs18b1cf3f53da08c@mail.gmail.com...
                       Hi,

                       I'm currently trying to polymorphically serialize a class without using RTTI. I'm doing this currently in a file called StaticText.hpp:

                       #ifndef RS_GUI_WIDGETS_STATICTEXT_HPP
                       #define RS_GUI_WIDGETS_STATICTEXT_HPP


                       #include <boost/scoped_ptr.hpp>
                       #include <boost/serialization/access.hpp>
                       #include <boost/serialization/base_object.hpp>
                       #include <boost/serialization/string.hpp>
                       #include <boost/serialization/extended_type_info_no_rtti.hpp>
                       #include <boost/serialization/export.hpp>


                       #include <rs/gui/widgets/Widget.hpp>
                       #include <rs/gui/Text.hpp>




                       namespace rs
                       {
                           class StaticText : public Widget
                           {
                           public:
                               StaticText( std::string const& text );


                               void Update();
                               void Render( RenderSystem& renderer, Camera& camera );
                               char const* get_key() const;


                           private:
                               StaticText() {}


                               template< class Archive >
                               void serialize( Archive& archive, unsigned int version )
                               {
                                   archive & boost::serialization::base_object<Widget>( *this );


                                   std::string text;
                                   archive & text;
                                   m_text.reset( new Text( text ) );
                               }


                               boost::scoped_ptr<Text> m_text;


                               friend class boost::serialization::access;
                           };
                       }


                       BOOST_CLASS_TYPE_INFO(
                           rs::StaticText,
                           extended_type_info_no_rtti<rs::StaticText>
                           )


                       BOOST_CLASS_EXPORT( rs::StaticText )


                       #endif // RS_GUI_WIDGETS_STATICTEXT_HPP

                       When I compile this into a LIB first, and then link the lib into an EXE, the linker says this (Visual Studio 2008):
                       gui.lib(StaticText.obj) : error LNK2005: "public: static struct boost::archive::detail::guid_initializer<class rs::StaticText> const & const boost::archive::detail::init_guid<class rs::StaticText>::guid_initializer" (?guid_initializer@?$init_guid@VStaticText@rs@@@detail@archive@boost@@2ABU?$guid_initializer@VStaticText@rs@@@234@B) already defined in main.obj


                       If I move the 2 macro calls into the StaticText.cpp file, everything compiles/links just fine but I end up getting an exception thrown at runtime that says "unregistered void cast".

                       ________________________________

                                               _______________________________________________
                       Boost-users mailing list
                       Boost-users@lists.boost.org
                       http://lists.boost.org/mailman/listinfo.cgi/boost-users


               _______________________________________________
               Boost-users mailing list
               Boost-users@lists.boost.org
               http://lists.boost.org/mailman/listinfo.cgi/boost-users



_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users