0

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?

Community
  • 1
  • 1
Jepessen
  • 11,744
  • 14
  • 82
  • 149
  • There are two serialization libraries -- `boost_serialization` and `boost_wserialization`. In the second example, you're probably still linking with the former, rather than the latter. – Dan Mašek May 13 '16 at 08:18
  • I'm not linking anything. I'm using the auto linking option of boost. It should be able to select the right library, correct? – Jepessen May 13 '16 at 08:37
  • I can't vouch for that, I have auto linking disabled in my project. However, looking at the [source](https://github.com/boostorg/serialization/blob/boost-1.57.0/include/boost/serialization/config.hpp#L71) it seems to me the automatic linking is only implemented for the non-wide variant. -- Never mind, [found it](https://github.com/boostorg/serialization/blob/boost-1.57.0/include/boost/archive/detail/auto_link_warchive.hpp#L34). Odd, dunno. – Dan Mašek May 13 '16 at 08:41
  • Ok thanks anyway. I'll ask directly to boost mailing list. – Jepessen May 13 '16 at 08:53

0 Answers0