неэкспортируемые классы в разделяемой библиотеке C ++

0

Я немного запутался в создании общей библиотеки в 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++?
  • 0
    Какой компилятор вы используете?
  • 0
    Я использую MSVC с OpenGL x32 / x64, но я собираюсь использовать комплекты Android для Qt на платформе Win8x64. Это актуально?
Теги:
qt

2 ответа

1
Лучший ответ

Экспортируется ли символ или нет по умолчанию, зависит от компилятора. В MSVC по умолчанию экспортированные символы не экспортируются. В MSVC внешние пользователи DLL должны видеть только MyClass1. В GCC все символы экспортируются по умолчанию.

Ваш код, насколько я вижу, выглядит отлично.

  • 0
    Спасибо за быстрый ответ. Я просто хотел разобрать мое приложение на стадии разработки; 1.Core Lib, 2.Second Lib использует Core Lib и 3. GUI использует все. Или что-то в этом роде.
  • 0
    @Cahit: это звучит как разумный раскол!
Показать ещё 3 комментария
1

Предполагая, что эти классы не являются частью анонимного пространства имен, поскольку MyClass2 и MyClass3 не имеют явных атрибутов видимости, по умолчанию используется видимость символа по умолчанию.

С этого момента поведение зависит от компилятора. По умолчанию видимость является "общедоступной" как в Clang, так и в GCC, если она не изменена с -fvisibility опции -fvisibility (или прагмы), поэтому эти два класса будут экспортированы из DSO.

Лучший способ избежать экспорта непредвиденных символов, я рекомендую вам поменять видимость на скрытые по умолчанию (fvisibility=hidden) и экспортировать только символы, которые вам нужны.

Надеюсь, поможет. Удачи!

  • 0
    Открытые и закрытые классы в C # изменяют параметры видимости в фоновом режиме или что-то в этом роде?
  • 0
    @ CahitBurakKüçüksütcü C #? Понятия не имею.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню