C++ 符号导出

标签 c++ dllexport class-visibility

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

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

是否也没有办法让所有私有(private)成员都在本地? (因为它们是私有(private)的,所以不应该直接访问它们)这将使标记过程不那么乏味......

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

最佳答案

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

关于C++ 符号导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12500259/

相关文章:

c++ - MSVC 的虚方法崩溃

c++ - 对于 C/C++,什么时候不使用面向对象编程有好处?

c# - 导出函数(VS2008)的默认调用约定是什么?

c++ - 在 C++ DLL 中使用 C 风格导出 API 之间公共(public)类的方法

对计算属性的 Swift 访问控制 : why does this work?

c++ - 自述文件到 C++ 项目

c++ - 如何从 DLL 导出数组?

java - 包保护类中的公共(public)方法是否有任何理由?

java - Java中包私有(private)类的改进

c++ - C++中的快速内存访问?