Boost logo

Boost Users :

Subject: Re: [Boost-users] [serialization] Multiply defined symbol:guid_initializer
From: Robert Dailey (rcdailey_at_[hidden])
Date: 2009-04-03 12:26:18


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_at_[hidden]>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_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 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