Knowhow/C, C++, CMake

Boost serialization 팁들

침닦는수건 2023. 9. 25. 21:05
반응형

Tips

1) shared_ptr <A> 와 같이 쓴 변수들은 A에 serialize() overriding을 해줬더라도 오류가 난다. 다음 include 필수. 세트로 <vector>도 잊지 말자.

#include<boost/serialization/vector.hpp>
#include<boost/serialization/shared_ptr.hpp>

 


2) 다음와 같은 오류명이 잔뜩 뜰 수 있음

[build] /usr/bin/ld: ../core/libsfm.so: undefined reference to `boost::archive::detail::basic_iarchive::next_object_pointer(void*)'
[build] /usr/bin/ld: ../core/libsfm.so: undefined reference to `boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive, char, std::char_traits<char> >::init()'
[build] /usr/bin/ld: ../core/libsfm.so: undefined reference to `boost::archive::detail::basic_iarchive::load_pointer(void*&, boost::archive::detail::basic_pointer_iserializer const*, boost::archive::detail::basic_pointer_iserializer const* (*)(boost::serialization::extended_type_info const&))'
[build] /usr/bin/ld: ../core/libsfm.so: undefined reference to `typeinfo for boost::archive::detail::basic_oserializer'
[build] /usr/bin/ld: ../core/libsfm.so: undefined reference to `boost::archive::detail::basic_oserializer::~basic_oserializer()'
[build] /usr/bin/ld: ../core/libsfm.so: undefined reference to `boost::archive::detail::basic_oarchive::basic_oarchive(unsigned int)'
[build] /usr/bin/ld: ../core/libsfm.so: undefined reference to `boost::archive::detail::basic_pointer_iserializer::~basic_pointer_iserializer()'
[build] /usr/bin/ld: ../core/libsfm.so: undefined reference to `boost::archive::detail::basic_oarchive::end_preamble()'
[build] /usr/bin/ld: ../core/libsfm.so: undefined reference to `boost::archive::detail::basic_pointer_iserializer::basic_poi

이건 boost::serialization을 제대로 못찾아서 그런데 CMakeList에서 필수적으로 포함시키도록 명시해줘야 해결됨.

find_package(Boost 1.58.0 REQUIRED COMPONENTS filesystem program_options serialization)

3) cv::Mat serialization할 때 뜬금없이 다음과 같은 Eigen관련 오류가 날 수 있음.

[build] /usr/include/boost/serialization/access.hpp:116:11: error: 'class Eigen::Matrix<double, 2, 1>' has no member named 'serialize'; did you mean 'normalize'?

(정확하진 않으나) cv::Mat 내에서도 Eigen::Matrix가 쓰이고 호환되므로, 코드에서 cv::Mat에 Eigen으로 된 변수들을 쌓는 내용이 있을 경우 발생하는 것으로 보임. 근데 위 오류를 해결하기 위해서 Eigen::MatrixXf 나 Eigen::MatrixXd 백날 serialization해봤자 해결이 안됨.

 

이것은 cv::Mat serialization에 필요해서 그런 것이므로 cv::Mat serialization하는 과정 안에 집어 넣어주어야 함.

위 오류명에서 <double, 2, 1> 이므로 Eigen::Vector2d&를 해주니까 되더라. 복잡하다;

BOOST_SERIALIZATION_SPLIT_FREE(cv::Mat)
namespace boost {
namespace serialization {
    template <class Archive>
    void save(Archive& ar, const cv::Mat& m, const unsigned int version) {
        size_t elem_size = m.elemSize();
        size_t elem_type = m.type();
        ar & m.cols;
        ar & m.rows;
        ar & elem_size;
        ar & elem_type;

        const size_t data_size = m.cols * m.rows * elem_size;
        ar & boost::serialization::make_array(m.ptr(), data_size);
    }

    template <class Archive>
    void load(Archive& ar, cv::Mat& m, const unsigned int version) {
        int cols, rows;
        size_t elem_size, elem_type;

        ar & cols;
        ar & rows;
        ar & elem_size;
        ar & elem_type;

        m.create(rows, cols, elem_type);

        size_t data_size = m.cols * m.rows * elem_size;
        ar & boost::serialization::make_array(m.ptr(), data_size);
    }
    
    template <class Archive>
    void serialize(Archive& ar, Eigen::Vector2d& pt, const unsigned int version) {
    ar & pt(0);
    ar & pt(1);
    }
}}
반응형

'Knowhow > C, C++, CMake' 카테고리의 다른 글

STL vector 팁들  (0) 2023.09.27
TBB 팁  (0) 2023.09.25
Boost serialization  (0) 2023.09.25
CMake 백과사전  (0) 2023.09.21
VScode C/C++ 개발 세팅, CMakeLists.txt 이용하기 2  (0) 2023.01.09