반응형
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 |