Предупреждение “class X должен иметь dll-интерфейс для использования клиентами class Y”

165
21 апреля 2018, 19:15

Здравствуйте. Продолжаю постигать хитросплетения С++. На этот раз решил попробовать написать уже динамическую библиотеку (то есть .dll) для упрощенной работы с GUI Windows. Все классы и необходимые функции экспортируются - __declspec(dllexport). Все было хорошо, но дело в том что у меня во многих классах по задумке должны быть атрибуты отвечающие за различные события, они в виде лямбд (например std::function<void()> onPaint_ и прочие). И вот когда я добавил лямбды как атрибуты своего класса - стали появляться warning'и при компиляции. А именно вот такого содержания:

class "std::function" должен иметь dll-интерфейс для использования клиентами class "wquery::Window"

Не совсем понимаю в чем суть и что имеется в виду? Лямба, это ведь по сути объект шаблонного класса (или я ошибаюсь)? То есть я не могу использовать в интерфейсе какие-то сторонние объекты, у которых.. нет.. __declspec(dllexport) в их классах? Или что? Это потому-что.. на той платформе, где будет использоваться .dll, классы этих объектов могут быть не теми что используются при ее сборке? В этом дело? Но как тогда правильно подойти к этой задаче?

Я попробовал использовать указатель (то есть std::function<void()>* onPaint_), тогда варнинги исчезают, возникает другая проблема - как обратиться к лямбде как к функции (чтобы вызвать ее), когда у меня есть только указатель на объект лямбды? То есть если раньше я мог делать вот так - window->onPaint_(), то теперь такое, понятное дело, не срабатывает. Я пытался делать что-то вот такое - *(window->onPaint_)(), но компилятор на это тоже ругается.

В общем хотелось бы понять, как лучше подойти к этому всему. Может быть я делаю что-то в корне не правильное? За ранее спасибо.

Answer 1

std::function<void()> это ни разу не лямбда. Если требуется использовать этот класс в интерфейсе библиотеки то его придется экспортировать из библиотеки иначе в библиотеке и использующем ее коде будет рассинхрон. Класс можно экспортировать явно инстанцировав его указав спецификатор экспорта:

 template class DLL_API ::std::function<void (void)>;

где DLL_API - __declspec(dllexport) или __declspec(dllimport)

READ ALSO
Изменение цвета рамки (WinAPI C++)

Изменение цвета рамки (WinAPI C++)

Как изменить цвет рамки в классическом приложении WinAPI? Как менять фон, я разобралсяА как задать не системный цвет окна? Допустим, у меня цветовая...

162
Удаление среднего символа с++

Удаление среднего символа с++

ЗдравствуйтеПоможет-ли кто-нибудь решить и подробно разобрать код и объяснить? По учебе задано

171
Шаблон в С++ (код)

Шаблон в С++ (код)

У меня есть кодПробовал найти в интернете, но не все понял

170
expression must have a constant value

expression must have a constant value

Ругается на BRICKSIZEx И BRICKSIZE

198