Переносимый архив не компилируется под GCC

Мне нужно (де) сериализовать данные как для Windows, так и для Linux (и передавать файлы между ними). Я хотел использовать портативные двоичные архивы библиотеки сериализации Boost, которые можно найти в примерах, см., Например, на http://boost-doc-zh.googlecode.com/svn-history/r380/trunk/libs/serialization/example/

Это отлично работает в Windows (VS 2008), но не компилируется под GCC 4.3.2 со следующими ошибками.

Можно ли предложить решение?

Спасибо большое!

/projects/lib/BOOST/1_44_0/include/boost/archive/basic_archive.hpp: In member function 'void portable_binary_iarchive::init(unsigned int)':
/projects/lib/BOOST/1_44_0/include/boost/archive/basic_archive.hpp:78: error: 'uint_least32_t boost::archive::version_type::t' is private
/home/myfolder/src/portable_binary_iarchive.cpp:92: error: within this context
/home/myfolder/src/portable_binary_iarchive.hpp: In member function 'void portable_binary_iarchive::load(T&) [with T = boost::archive::class_id_type]':
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:107:   instantiated from 'static void boost::archive::load_access::load_primitive(Archive&, T&) [with Archive = portable_binary_iarchive, T = boost::archive::class_id_type]'
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:356:   instantiated from 'static void boost::archive::detail::load_non_pointer_type<Archive>::load_primitive::invoke(Archive&, T&) [with T = boost::archive::class_id_type, Archive = portable_binary_iarchive]'
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:433:   instantiated from 'static void boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&) [with T = boost::archive::class_id_type, Archive = portable_binary_iarchive]'
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:586:   instantiated from 'void boost::archive::load(Archive&, T&) [with Archive = portable_binary_iarchive, T = boost::archive::class_id_type]'
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/common_iarchive.hpp:66:   instantiated from 'void boost::archive::detail::common_iarchive<Archive>::load_override(T&, int) [with T = boost::archive::class_id_type, Archive = portable_binary_iarchive]'
/home/myfolder/src/portable_binary_iarchive.hpp:140:   instantiated from 'void portable_binary_iarchive::load_override(T&, int) [with T = boost::archive::class_id_type]'
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/interface_iarchive.hpp:60:   instantiated from 'Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&) [with T = boost::archive::class_id_type, Archive = portable_binary_iarchive]'
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/common_iarchive.hpp:51:   instantiated from 'void boost::archive::detail::common_iarchive<Archive>::vload(boost::archive::class_id_type&) [with Archive = portable_binary_iarchive]'
/home/myfolder/src/portable_binary_iarchive.cpp:128:   instantiated from here
/home/myfolder/src/portable_binary_iarchive.hpp:107: error: call of overloaded 'class_id_type(intmax_t&)' is ambiguous
/projects/lib/BOOST/1_44_0/include/boost/archive/basic_archive.hpp:118: note: candidates are: boost::archive::class_id_type::class_id_type(size_t)
/projects/lib/BOOST/1_44_0/include/boost/archive/basic_archive.hpp:115: note:                 boost::archive::class_id_type::class_id_type(int)

Ответ 1

Не совсем прямой ответ на ваш вопрос, но у меня был большой успех с буферами протокола Google. Они используют их внутренне и открывают их источники: http://code.google.com/p/protobuf/

Ответ 2

Я построил с g++ 4.1.2, и он отлично работает. Я ненавижу бьям, трудно понять, что происходит, и это невероятно медленно. Было предупреждение об устаревшем заголовке, и поскольку в нем есть ссылки на декларацию с устаревшим объявлением, я надеялся увидеть что-то старое, но я этого не делаю.

Вы построили его с помощью bjam или попытались вывести сериализацию в свой собственный каталог и сделать это сами? Потому что ваша структура каталогов не совсем такая, как у них в пакете.

Ответ 3

#define private public

следует избавиться от первой ошибки в доступе к закрытым членам. Это немного дерзко! Но он может работать как временное исправление, пока вы не поймете всю программу лучше.