我对在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() {...}
我的问题是:
答案 0 :(得分:1)
默认情况下是否导出符号取决于编译器。 在MSVC中,默认情况下不会导出任何符号。在MSVC下,DLL的外部用户只能看到MyClass1。在GCC中,默认情况下会导出所有符号。
就我所见,你的代码看起来非常好。
答案 1 :(得分:1)
假设这些类不是匿名命名空间的一部分,因为MyClass2
和MyClass3
没有明确的可见性属性,它默认为默认符号可见性。
从这一点来看,行为取决于编译器。除非使用-fvisibility
选项(或编译指示)进行更改,否则Clang和GCC中的默认可见性为“public”,因此这两个类将从DSO导出。
避免导出非预期符号的最佳方法,我建议您默认情况下将可见性更改为隐藏(fvisibility=hidden
)并仅导出您需要的符号。
希望它有所帮助。祝你好运!