Boost logo

Boost Users :

Subject: Re: [Boost-users] [serialization] Multiply defined symbol:guid_initializer
From: Renaud Lepere (Renaud.Lepere_at_[hidden])
Date: 2009-04-03 12:05:50


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_at_[hidden] [mailto:boost-users-bounces_at_[hidden]] De la part de Robert Dailey
        Envoyé : vendredi 3 avril 2009 16:56
        À : boost-users_at_[hidden]
        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_at_[hidden]> 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_at_[hidden]> wrote in message news:496954360904021720o79c9c17cs18b1cf3f53da08c_at_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_at_VStaticText@rs@@@detail_at_archive@boost@@2ABU?$guid_initializer_at_VStaticText@rs@@@234_at_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_at_[hidden]
                        http://lists.boost.org/mailman/listinfo.cgi/boost-users

                        
                _______________________________________________
                Boost-users mailing list
                Boost-users_at_[hidden]
                http://lists.boost.org/mailman/listinfo.cgi/boost-users
                


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