I'm using:
- Visual studio 2013 Update 5;
- Boost 1.57.0; built using boost site documentation except that for
address-model=64
flag (I need to create 64bit applications).
I've created a new project for testing serialization. This code compile just fine:
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/nvp.hpp>
#include <fstream>
struct MyStruct {
double data;
private:
friend class boost::serialization::access;
private:
template<class Archive>
void serialize(Archive & archive, const unsigned int version) {
archive & BOOST_SERIALIZATION_NVP(data);
};
};
int main() {
std::ifstream fileStream("myfile.xml");
boost::archive::binary_iarchive archive(fileStream);
MyStruct myStruct;
archive >> BOOST_SERIALIZATION_NVP(myStruct);
return 0;
}
But if I pass to wide char I obtain linking errors.
This code:
#include <boost/archive/binary_wiarchive.hpp>
#include <boost/serialization/nvp.hpp>
#include <fstream>
struct MyStruct {
double data;
private:
friend class boost::serialization::access;
private:
template<class Archive>
void serialize(Archive & archive, const unsigned int version) {
archive & BOOST_SERIALIZATION_NVP(data);
};
};
int main() {
std::wifstream fileStream(L"myfile.xml");
boost::archive::binary_wiarchive archive(fileStream);
MyStruct myStruct;
archive >> BOOST_SERIALIZATION_NVP(myStruct);
return 0;
}
Gives me these linking errors:
1>main.obj : error LNK2019: unresolved external symbol "protected: void __cdecl boost::archive::basic_binary_iprimitive<class boost::archive::binary_wiarchive,wchar_t,struct std::char_traits<wchar_t> >::init(void)" (?init@?$basic_binary_iprimitive@Vbinary_wiarchive@archive@boost@@_WU?$char_traits@_W@std@@@archive@boost@@IEAAXXZ) referenced in function "protected: void __cdecl boost::archive::binary_iarchive_impl<class boost::archive::binary_wiarchive,wchar_t,struct std::char_traits<wchar_t> >::init(unsigned int)" (?init@?$binary_iarchive_impl@Vbinary_wiarchive@archive@boost@@_WU?$char_traits@_W@std@@@archive@boost@@IEAAXI@Z)
1>main.obj : error LNK2019: unresolved external symbol "protected: __cdecl boost::archive::basic_binary_iprimitive<class boost::archive::binary_wiarchive,wchar_t,struct std::char_traits<wchar_t> >::basic_binary_iprimitive<class boost::archive::binary_wiarchive,wchar_t,struct std::char_traits<wchar_t> >(class std::basic_streambuf<wchar_t,struct std::char_traits<wchar_t> > &,bool)" (??0?$basic_binary_iprimitive@Vbinary_wiarchive@archive@boost@@_WU?$char_traits@_W@std@@@archive@boost@@IEAA@AEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@_N@Z) referenced in function "protected: __cdecl boost::archive::binary_iarchive_impl<class boost::archive::binary_wiarchive,wchar_t,struct std::char_traits<wchar_t> >::binary_iarchive_impl<class boost::archive::binary_wiarchive,wchar_t,struct std::char_traits<wchar_t> >(class std::basic_istream<wchar_t,struct std::char_traits<wchar_t> > &,unsigned int)" (??0?$binary_iarchive_impl@Vbinary_wiarchive@archive@boost@@_WU?$char_traits@_W@std@@@archive@boost@@IEAA@AEAV?$basic_istream@_WU?$char_traits@_W@std@@@std@@I@Z)
1>main.obj : error LNK2019: unresolved external symbol "protected: __cdecl boost::archive::basic_binary_iprimitive<class boost::archive::binary_wiarchive,wchar_t,struct std::char_traits<wchar_t> >::~basic_binary_iprimitive<class boost::archive::binary_wiarchive,wchar_t,struct std::char_traits<wchar_t> >(void)" (??1?$basic_binary_iprimitive@Vbinary_wiarchive@archive@boost@@_WU?$char_traits@_W@std@@@archive@boost@@IEAA@XZ) referenced in function "int `protected: __cdecl boost::archive::binary_iarchive_impl<class boost::archive::binary_wiarchive,wchar_t,struct std::char_traits<wchar_t> >::binary_iarchive_impl<class boost::archive::binary_wiarchive,wchar_t,struct std::char_traits<wchar_t> >(class std::basic_istream<wchar_t,struct std::char_traits<wchar_t> > &,unsigned int)'::`1'::dtor$0" (?dtor$0@?0???0?$binary_iarchive_impl@Vbinary_wiarchive@archive@boost@@_WU?$char_traits@_W@std@@@archive@boost@@IEAA@AEAV?$basic_istream@_WU?$char_traits@_W@std@@@std@@I@Z@4HA)
1>main.obj : error LNK2019: unresolved external symbol "protected: void __cdecl boost::archive::basic_binary_iarchive<class boost::archive::binary_wiarchive>::load_override(struct boost::archive::class_name_type &,int)" (?load_override@?$basic_binary_iarchive@Vbinary_wiarchive@archive@boost@@@archive@boost@@IEAAXAEAUclass_name_type@23@H@Z) referenced in function "protected: void __cdecl boost::archive::binary_iarchive_impl<class boost::archive::binary_wiarchive,wchar_t,struct std::char_traits<wchar_t> >::load_override<struct boost::archive::class_name_type>(struct boost::archive::class_name_type &,int)" (??$load_override@Uclass_name_type@archive@boost@@@?$binary_iarchive_impl@Vbinary_wiarchive@archive@boost@@_WU?$char_traits@_W@std@@@archive@boost@@IEAAXAEAUclass_name_type@12@H@Z)
1>main.obj : error LNK2019: unresolved external symbol "protected: void __cdecl boost::archive::basic_binary_iarchive<class boost::archive::binary_wiarchive>::init(void)" (?init@?$basic_binary_iarchive@Vbinary_wiarchive@archive@boost@@@archive@boost@@IEAAXXZ) referenced in function "protected: void __cdecl boost::archive::binary_iarchive_impl<class boost::archive::binary_wiarchive,wchar_t,struct std::char_traits<wchar_t> >::init(unsigned int)" (?init@?$binary_iarchive_impl@Vbinary_wiarchive@archive@boost@@_WU?$char_traits@_W@std@@@archive@boost@@IEAAXI@Z)
1>path\QtSerializationSample.exe : fatal error LNK1120: 5 unresolved externals
I've seen in another reply that I can use binary_iarchive
in order to save also wide char strings, but I'd like to use wifstream
in order to maintain uniformity across the code for other reasons.
Is there a way to use binary_wiarchive
correctly?