C ++共享库中的未导出的类

时间:2014-02-26 17:41:28

标签: c++ qt

我对在Qt中创建共享库感到有点困惑,实际上是在C ++中,我的问题中没有Qt特定的问题。这是一个场景。

这是我的共享库的全局标题。

#if defined(MYAPI_LIBRARY)
#  define MYAPI Q_DECL_EXPORT
#else
#  define MYAPI Q_DECL_IMPORT
#endif

这是一个导出的类。

#include "myapi_global.h"
#include "MyClass2.h"
#include "MyClass3.h"
#include "myfuncs.h"

class MYAPI MyClass1
{
...
public:
    MyClass2 myClass2;
private:
    MyClass3 myClass3;
};

这是MyClass1

使用的未导出的类
class MyClass3
{
..
}

这是MyClass1使用的另一个未导出的类

class MyClass2
{
..
}

非分类函数的最后一个头文件(myfuncs.h)。

int foo() {...}

我的问题是:

  1. 我的MyClass2,MyClass3和foo()是否对共享库的用户可见?用户可以使用它们吗?如果是,则MYAPI关键字似乎毫无意义。
  2. 在C ++中创建共享库的模式是否有任何错误?

2 个答案:

答案 0 :(得分:1)

默认情况下是否导出符号取决于编译器。 在MSVC中,默认情况下不会导出任何符号。在MSVC下,DLL的外部用户只能看到MyClass1。在GCC中,默认情况下会导出所有符号。

就我所见,你的代码看起来非常好。

答案 1 :(得分:1)

假设这些类不是匿名命名空间的一部分,因为MyClass2MyClass3没有明确的可见性属性,它默认为默认符号可见性。

从这一点来看,行为取决于编译器。除非使用-fvisibility选项(或编译指示)进行更改,否则Clang和GCC中的默认可见性为“public”,因此这两个类将从DSO导出。

避免导出非预期符号的最佳方法,我建议您默认情况下将可见性更改为隐藏(fvisibility=hidden)并仅导出您需要的符号。

希望它有所帮助。祝你好运!