我将boost::serialization
用于我的课程。由于我有一些继承,我必须使用BOOST_CLASS_EXPORT
来“注册”我的课程。希望我没有误解任何事情。
我使用这个宏:
BOOST_CLASS_EXPORT(MyClass)
甚至我用这个:
BOOST_CLASS_EXPORT_GUID(MyClass, "MyClass")
在一个标题文件中,例如MyClass.h,它还包含MyClass的定义。但是,即使我试图将宏放在我的一个源(* .cpp)文件中,它也会再次失败。
我在main()
结束时遇到分段错误。 Stacktrace显示调用堆栈与this problem几乎相同。我无法找到解决此问题的解决方案或解决方法。我认为问题是因为析构函数,但我不知道如何解决它。我甚至不能说这是我的错,或者是提升中的一个错误。 (我希望我能自己修理它是我的错)
这有什么解决方案/解决方法吗?为什么会出现这个问题?
我的构建环境是:Ubuntu 10.04 64位服务器(内核2.6.32),gcc 4.4.3,增强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的另一台机器运行良好。
更新:我将整个项目简化为一个小例子。它放在底部,也可以在my gist上找到。这些课程什么都不做,而且(我的)程序什么都不做。然而BOOST_CLASS_EXPORT
会导致分段错误。
请注意,如果我删除f1.cpp
或f2.cpp
,问题就会消失(需要多个编译单元)。类似的情况发生在class A/A_child
和B/B_child
上。我不知道为什么只有一个班级不会出现这个问题。
g++ -Wall -g3 -O0 -o program main.cpp f1.cpp f2.cpp -lboost_serialization
#include "MyClass.h"
#include "MyClass.h"
int main(int argc, char *argv[])
{
}
#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