Экспорт класса из C ++ DLL? - PullRequest
3 голосов
/ 22 февраля 2009

Как мне выставить класс из DLL?

Приложение, импортирующее dll, должно иметь возможность создавать объекты класса, а также он должен иметь возможность вызывать функции-члены класса.

Похоже ли это на предоставление функций типа C с использованием __declspec(dllexport)?

А также, когда я собрал dll (который содержит определение класса только в заголовочном файле и определения его функций-членов в файле cpp), соответствующий файл lib не создается.

Ответы [ 5 ]

2 голосов
/ 22 февраля 2009

Определение хотя бы одного открытого метода в экспортируемом классе должно иметь префикс _declspec (dllexport) для создания файла lib. Если ни один из методов не имеет этого префикса, будет доступно только объявление (т.е. файл заголовка), но создать экземпляр класса будет невозможно (для этого необходим экспортированный конструктор). Если хотя бы один метод имеет префикс _declspec (dllexport), то компилятор поймет, что пользователи dll должны иметь возможность ссылаться на эту dll. ОС загружает такие библиотеки, как только загружается exe-ссылка на них.

Вы можете рассмотреть «заводской» подход к вашей проблеме. Например, ОС Symbian реализует такой подход с полиморфными библиотеками. Для этого вам необходимо:

  1. Объявите (т.е. файл заголовка) и определите (например, файл cpp) класс в вашей dll. Больше ничего не нужно.

  2. Создайте "фабричную" функцию в вашей dll, которая создаст экземпляр для вашего класса и вернет указатель на него. Эта функция должна иметь префикс _declspec (dllexport).

  3. Поделитесь своим заголовочным файлом и файлом lib со своими пользователями.

  4. Пользователи включают заголовочный файл и ссылку на файл lib.

  5. Пользователи вызывают фабричную функцию, чтобы создать экземпляр класса (то есть создать объект), а затем использовать его как обычный класс.

5 вышеприведенных шагов работают как шарм в Symbian OS. Вы должны попробовать сами на своей платформе и опубликовать результаты. Я, честно говоря, не пробовал это на Windows.

2 голосов
/ 22 февраля 2009

Здесь . Помните, что вы не можете использовать этот экспортированный класс, используя LoadLibrary () / GetProcAddress ().

1 голос
/ 22 февраля 2009

Похоже ли это на предоставление функций типа C с использованием _declspec(dllexport)?

Да. И __declspec может применяться к классу.

соответствующий файл не создан

IIRC это значение по умолчанию, но вы можете переопределить параметры компоновщика по умолчанию.

0 голосов
/ 22 февраля 2009

Поиск в Google для "класса dllexport" привел к этой странице из MSDN в качестве первого результата.

Похоже, что на странице указано, что __declspec(dllexport) - это все, что вам нужно сделать.

0 голосов
/ 22 февраля 2009

Посмотрите на Def Files , в дополнительной первой ссылке оттуда есть Использование __declspec (dllexport)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...