Я использую boost::serialization
для своих занятий. Так как у меня есть наследство, я должен использовать BOOST_CLASS_EXPORT
, чтобы «зарегистрировать» мой класс. Надеюсь, я ничего не понял.
Я использую этот макрос:
BOOST_CLASS_EXPORT(MyClass)
Или даже я использую это:
BOOST_CLASS_EXPORT_GUID(MyClass, "MyClass")
в одном заголовочном файле , например, MyClass.h, который также содержит определение MyClass. Однако даже если я попытался поместить макрос в один из моих исходных файлов (* .cpp), он снова завершился неудачей.
Я получаю ошибку сегментации в конце main()
. Stacktrace показывает, что стек вызовов почти одинаков с этой проблемой . Я не могу найти решение или обойти эту проблему. Я думаю, что проблема из-за деструктора, но я не знаю, как ее решить. Я даже не могу сказать, что это моя ошибка или ошибка в наддуве. (Я надеюсь, что это моя вина, что я могу исправить это самостоятельно)
Есть ли какое-либо решение / обходной путь для этого? И почему возникает проблема?
Моя среда сборки: 64-битный сервер Ubuntu 10.04 (ядро 2.6.32), gcc 4.4.3, boost 1.40. (Я нашел его на /usr/include/boost/version.hpp
и использую apt-cache show libboost-dev
, чтобы увидеть версию)
Я использую -Wall -g3 -O0
в качестве опции компилятора.
Странно, проблема возникает только на одной из моих машин. Хорошо работает еще одна машина с CentOS (ядро 2.6.18), gcc 4.1.2 и boost 1.41.
Обновление: я сократил весь проект до небольшого примера. Это помещено в основание и также доступно на моя суть . Классы ничего не делают, а программа (моя) ничего не делает. Тем не менее BOOST_CLASS_EXPORT
вызывает ошибку сегментации.
Обратите внимание, что если я удалю f1.cpp
или f2.cpp
, проблема исчезнет (требуется несколько модулей компиляции). Подобное состояние встречается на class A/A_child
и B/B_child
. Я понятия не имею, почему проблема не возникает только для одного класса.
Код
Compile
g++ -Wall -g3 -O0 -o program main.cpp f1.cpp f2.cpp -lboost_serialization
f1.cpp
#include "MyClass.h"
f2.cpp (то же самое с f1.cpp)
#include "MyClass.h"
main.cpp
int main(int argc, char *argv[])
{
}
MyClass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include <boost/serialization/export.hpp>
#include <boost/serialization/vector.hpp>
using namespace std;
class A
{
public:
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
}
};
class A_child: public A
{
public:
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & boost::serialization::base_object<A>(*this);
}
};
BOOST_CLASS_EXPORT(A_child)
class B
{
public:
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
}
};
class B_child: public B
{
public:
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & boost::serialization::base_object<B>(*this);
}
};
BOOST_CLASS_EXPORT(B_child)
#endif