0

私は、Linux、Windows、および osX の C++ ライブラリの開発者です。osX は匿名の例外を適切に処理しないようになったため、エクスポートする必要があるシンボルを明確にマークすることを検討しました。これらの説明に続いて、 2 つのマクロを定義しました:FOO_APIおよびFOO_LOCALシンボルをマークするため。今、私は次の問題を抱えています:

各クラスを独自のファイルで定義します (1000 以上の長いファイルは必要ないため)。クラスAがライブラリでのみ使用されている場合は、 でマークするのが理にかなっていFOO_LOCALます。しかし、クラスBにタイプ のプライベート メンバーがありA、クラスBFOO_APIである場合、コンパイラの警告が表示され、リンクが失敗します (シンボルが見つかりません)。これは、これらのエクスポート属性の要点全体に反しているようです。それで、それはどうあるべきですか?class FOO_LOCAL A {...}Is this right?のようなものでクラスをマークします。

すべてのプライベートメンバーをローカルにする方法もありませんか? (それらは非公開であるため、直接アクセスすることは想定されていません) これにより、マーキングプロセスが面倒ではなくなります...

最後に、たとえば例外クラスをマークすると、適切にコンパイルおよび実行されますが、シンボル ( nm -C -D my_lib.so) を表示すると、すべてのシンボルがまだそこにあることがわかります...

4

1 に答える 1

1

pimpl イディオムを使用して、API クラスのライブラリ内部実装をパブリックから非表示にすることができます (したがって、ライブラリをリンクするとき)。

南 お気に入り:

B.hpp:

class BImpl;

class FOO_API B
{
public:
    // Public stuff
    B();
    ~B();

    void foo();
private:
    BImpl* bimpl;
};

B.cpp:

#include "B.hpp"
#include "A.hpp"

struct BImpl
{
    void foo()
    {
        // Do something with 'a'
    }

    A a;
};

B::B()
: bimpl(new BImpl())
{
}

B::~B()
{
    delete bimpl;
}

void B::foo()
{
    bimpl->foo();
}
于 2012-09-19T18:02:48.840 に答える