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