2

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.cppor 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
4

0 回答 0