可携式归档在GCC下无法编译

11
我需要在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)
3个回答

1

虽然这不是直接回答你的问题,但我在使用Google的Protocol Buffers时取得了很大的成功。他们在内部使用并开源了它们:http://code.google.com/p/protobuf/


谢谢,但我知道protobuf,它不适合我的架构。因此,我正在寻找一种Boost序列化的方法来完成它。 - Philipp

0
#define private public

应该摆脱有关访问私有成员的第一个错误。这有点儿狡猾!但它可以作为一种临时修复,直到您更好地理解整个程序。


我认为这样做是安全的。除了测试它是否有效外,我从未自己尝试过。另一种方法是将其直接传递到编译命令行中 g++ -Dprivate=public prog.cpp -o prog。当然,你有责任确保正确处理私有数据。但如果你正确理解该类的内部结构,应该能够以明智的方式与之交互。 - Aaron McDaid

0

我使用 g++ 4.1.2 构建,它运行良好。我讨厌 bjam,它很难看到正在发生的事情,而且速度非常慢。 有一个关于弃用头文件的警告,由于这具有弃用友元声明的特征,我希望看到一些旧的东西,但我没有看到。

你是用 bjam 构建的还是尝试将序列化提取到自己的目录中并自己完成构建?因为你的目录结构不完全像包中的结构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接