2

boost::serialization私はクラスに使用します。私にはいくつかの継承があるのでBOOST_CLASS_EXPORT、クラスを「登録」するために使用する必要があります。私が何も誤解しなかったことを望みます。

私はこのマクロを使用します:

BOOST_CLASS_EXPORT(MyClass)

または私もこれを使用します:

BOOST_CLASS_EXPORT_GUID(MyClass, "MyClass")

MyClassの定義も含まれているMyClass.hなどの1つのヘッダーファイル。ただし、マクロをソース(* .cpp)ファイルの1つに入れようとしても、再び失敗します。

の終わりにセグメンテーション違反が発生しmain()ます。Stacktraceは、コールスタックがこの問題とほぼ同じであることを示しています。この問題の解決策や回避策が見つかりません。問題はデストラクタのせいだと思いますが、どうすれば解決できるのかわかりません。これが私のせいであるとか、ブーストのバグであるとさえ言えません。(自分で直せるのは私のせいだと思います)

これに対する解決策/回避策はありますか?そして、なぜ問題が発生するのですか?

私のビルド環境は、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コンパイラオプションとして使用しています。

不思議なことに、問題は私のマシンの1つでのみ発生します。CentOS(カーネル2.6.18)、gcc 4.1.2、およびBoost1.41を実行している別のマシンはうまくいきます。


更新:プロジェクト全体を小さな例にまとめます。それは底に置かれ、私の要点でも利用できます。クラスは何もしません、そして(私の)プログラムは何もしません。それにもかかわらず、BOOST_CLASS_EXPORTセグメンテーション違反が発生します。

f1.cppまたはを削除するf2.cppと、問題が解消されることに注意してください(複数のコンパイルユニットが必要です)。同様の状態がとで発生しclass A/A_childますB/B_child。1つのクラスだけで問題が発生しない理由がわかりません。

コード

コンパイル

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
4

0 に答える 0