link error using boost serialization library

Hi, I am trying to use boost serialization library, but run into link errors that I don't know how to resolve. I created a very simple data structure with a 'string' and 'int' in it. Then I try to serialize it to a stringstream and recover from a stringstream. The compile failed during linking. The first few errors are: % make g++ -O0 -g3 -Wall -D_REENTRANT -pthread -lboost_program_options -lboost_filesystem -lboost_iostreams -lboost_thread -lboost_regex -lboost_serialization -lpthread -o a.out main.o SimpleData.o main.o: In function `boost::archive::text_oarchive& boost::smart_cast_impl::reference<boost::archive::text_oarchive&>::polymorphic::cross::cast<boost::archive::detail::basic_oarchive>(boost::archive::detail::basic_oarchive&)': /usr/include/boost/smart_cast.hpp:76: undefined reference to `typeinfo for boost::archive::detail::basic_oarchive' main.o: In function `void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, std::basic_string<char, std::char_traits<char>, std::allocator<char> > main.o: In function `void boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save<int>(int const&)': /usr/include/boost/archive/text_oarchive.hpp:53: undefined reference to `boost::archive::basic_text_oarchive<boost::archive::text_oarchive>::newtoken()' main.o: In function `void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, int>(boost::archive::text_oarchive&, int const&)': /usr/include/boost/archive/detail/oserializer.hpp:91: undefined reference to `boost::archive::detail::basic_oarchive::end_preamble()' main.o: In function `void boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save<boost::archive::class_id_reference_type>(boost::archive::class_id_reference_type const&)': /usr/include/boost/archive/text_oarchive.hpp:53: undefined reference to `boost::archive::basic_text_oarchive<boost::archive::text_oarchive>::newtoken()' ...... I attached the source code of the 4 files I use: main.cpp, SimpleData.h, SimpleData.cpp, and Serialize.cpp. Also, here is the g++ version I use: % g++ -v Using built-in specs. Target: i486-linux-gnu Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --enable-checking=release i486-linux-gnu Thread model: posix gcc version 4.1.2 (Ubuntu 4.1.2-0ubuntu4) Is there something I missed in the include list? I tried '#include <boost/archive/detail/basic_oarchive.hpp>' in Serialize.h file, that would trigue compile error even before linking. Thanks, Yu main.cpp: #include <string> #include <iostream> #include "SimpleData.h" #include "Serialize.h" int main () { // test serialization of data structure SimpleData sd("hello", 1); std::string sdstr = saveData<SimpleData>(sd); std::cout << "Serialized simple data is:\n" << sdstr << std::endl; return 0; } SimpleData.h: #ifndef SIMPLEDATA_H_ #define SIMPLEDATA_H_ #include <string> class SimpleData { public: SimpleData(); SimpleData(std::string id_, int code_); virtual ~SimpleData(); std::string id; int code; }; #endif /*SIMPLEDATA_H_*/ SimpleData.cpp: #include "SimpleData.h" SimpleData::SimpleData () { id = "default"; code = 0; return; } SimpleData::SimpleData (std::string id_, int code_) : id(id_), code(code_) { return; } SimpleData::~SimpleData () { return; } Serialize.h: #ifndef SERIALIZE_H_ #define SERIALIZE_H_ #include <sstream> #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/serialization/base_object.hpp> #include <boost/serialization/utility.hpp> #include <boost/serialization/string.hpp> #include "SimpleData.h" namespace boost { namespace serialization { // add a serialize function below for each data structure that needs // to be serialized // serialize simple data template<class Archive> void serialize (Archive & _ar, SimpleData & _sd, const unsigned int _version) { _ar & _sd.id; _ar & _sd.code; } } } // serialize data structure and save into a string // note: there must be a serialize function defined // above for the data structure template<class Data> std::string saveData (const Data& _d) { std::ostringstream oss; boost::archive::text_oarchive oa(oss); oa << _d; return oss.str(); } // deserialize and recover data structure from a string template<class Data> Data loadData (const std::string& _s) { std::istringstream iss(_s); boost::archive::text_iarchive ia(iss); Data d; ia >> d; return d; } #endif /*SERIALIZE_H_*/
participants (1)
-
Y Fang