Я немного запутался в создании общей библиотеки в 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() {...}
Мои вопросы:
Экспортируется ли символ или нет по умолчанию, зависит от компилятора. В MSVC по умолчанию экспортированные символы не экспортируются. В MSVC внешние пользователи DLL должны видеть только MyClass1. В GCC все символы экспортируются по умолчанию.
Ваш код, насколько я вижу, выглядит отлично.
Предполагая, что эти классы не являются частью анонимного пространства имен, поскольку MyClass2
и MyClass3
не имеют явных атрибутов видимости, по умолчанию используется видимость символа по умолчанию.
С этого момента поведение зависит от компилятора. По умолчанию видимость является "общедоступной" как в Clang, так и в GCC, если она не изменена с -fvisibility
опции -fvisibility
(или прагмы), поэтому эти два класса будут экспортированы из DSO.
Лучший способ избежать экспорта непредвиденных символов, я рекомендую вам поменять видимость на скрытые по умолчанию (fvisibility=hidden
) и экспортировать только символы, которые вам нужны.
Надеюсь, поможет. Удачи!