c ++符号导出

时间:2012-09-19 17:55:24

标签: c++ dllexport class-visibility

我是Linux,Windows和osX上的c ++库的开发人员。由于osX现在无法正确处理匿名异常,因此我考虑清楚地标记需要导出的符号。在these explanations之后,我定义了两个宏:FOO_APIFOO_LOCAL来标记符号。现在我有以下问题:

我在自己的文件中定义每个类(因为我不想要1000多个长文件)。如果只在我的库中使用了类A,那么用FOO_LOCAL标记它是有意义的。但是,如果类B具有类型为A的私有成员,而类BFOO_API,则会收到编译器警告,并且链接失败(未找到符号)。这似乎无视这些出口属性的全部要点。那应该是什么?我用class FOO_LOCAL A {...}标记了我的课程这是对的吗?

是否也没有办法让所有私人会员都在当地? (因为它们是私有的,不应该直接访问)这会使标记过程变得不那么繁琐...

最后,当我标记我的异常类时,它会编译并正常运行,但显示符号(nm -C -D my_lib.so)表明所有符号仍然存在...

1 个答案:

答案 0 :(得分:1)

您可以使用pimpl idiom从公共隐藏API类的库内部实现(因此在链接库时)。

S.th。像:

<强> 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();
}