Ошибка компоновщика в форсированной сериализации пользовательского архива - PullRequest
0 голосов
/ 22 апреля 2020

Я попытался реализовать собственный тип архива для сериализации буста, следуя официальному примеру буста для записи архивов .

#include <iostream>
#include <vector>

#include <boost/serialization/nvp.hpp>
#include "boost/serialization/vector.hpp"

#include <boost/archive/detail/common_oarchive.hpp>
#include <boost/archive/detail/register_archive.hpp>

#include <boost/archive/detail/archive_serializer_map.hpp>


class complete_oarchive : public boost::archive::detail::common_oarchive<complete_oarchive>
{
    friend class boost::archive::save_access;

    template<class T>
    void save(T & t){
      std::cout << "saved data\n";
    }

public:
    void save_binary(void *address, std::size_t count){
    }
};


template class boost::archive::detail::archive_serializer_map<complete_oarchive>;
template class boost::archive::detail::common_oarchive<complete_oarchive>;
BOOST_SERIALIZATION_REGISTER_ARCHIVE(complete_oarchive)


int main(int argc, char *argv[])
{   

    std::vector<double> testVector = {1, 2, 3, 4};
    complete_oarchive oa;
    std::vector<double>* pVec = &testVector;
    oa << BOOST_SERIALIZATION_NVP(testVector);
    oa << BOOST_SERIALIZATION_NVP(pVec);

    return 0;
}

Компиляция этого примера с

g++    -c -g -std=c++11 -MMD -MP -MF "build/Debug/GNU-Linux/demo.o.d" -o build/Debug/GNU-Linux/demo.o demo.cpp
g++     -o dist/Debug/GNU-Linux/serializationdemo build/Debug/GNU-Linux/demo.o -lboost_serialization

приводит к следующей ошибке компоновщика

build/Debug/GNU-Linux/demo.o: In function `boost::archive::detail::pointer_oserializer<complete_oarchive, std::vector<double, std::allocator<double> > >::pointer_oserializer()':
/opt/tools/boost/boostRdk-1.66.0/include/boost/archive/detail/oserializer.hpp:222: undefined reference to `boost::archive::detail::archive_serializer_map<complete_oarchive>::insert(boost::archive::detail::basic_serializer const*)'
build/Debug/GNU-Linux/demo.o: In function `boost::archive::detail::pointer_oserializer<complete_oarchive, std::vector<double, std::allocator<double> > >::~pointer_oserializer()':
/opt/tools/boost/boostRdk-1.66.0/include/boost/archive/detail/oserializer.hpp:227: undefined reference to `boost::archive::detail::archive_serializer_map<complete_oarchive>::erase(boost::archive::detail::basic_serializer const*)'
collect2: error: ld returned 1 exit status 

Кажется, что сериализация указателя в

oa << BOOST_SERIALIZATION_NVP(pVec);

приводит к этой ошибке. После удаления этой строки все работает нормально и результат как и ожидался. У кого-нибудь есть опыт в написании собственных архивов сериализации?

Здесь была решена симимальная проблема https://groups.google.com/forum/#! Topic / boost-list / CMoDosGZUo8 , но я не смог решить эту проблему форвардом деклараций.

1 Ответ

1 голос
/ 22 апреля 2020

Я решил проблему, заменив

#include <boost/archive/detail/archive_serializer_map.hpp>

на

#include <boost/archive/impl/archive_serializer_map.ipp>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...