c++符号导出



我是Linux、Windows和osX上的c++库的开发人员。由于osX现在不能正确处理匿名异常,我考虑干净地标记需要导出的符号。根据这些解释,我定义了两个宏:FOO_APIFOO_LOCAL,用于标记符号。现在我有以下问题:

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

是否也没有办法让所有私人会员都在当地?(由于它们是私有的,不应该直接访问)这将使标记过程不那么乏味。。。

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

您可以使用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();
}

最新更新