ООП библиотека (С++ классы в .a .lib .dll)

Модератор: Модераторы разделов

MedVed
Сообщения: 112

ООП библиотека

Сообщение MedVed »

Люди, привет.
Столкнулся с такой проблеммой.
Потребовалось упаковать в библиотеку (.a, .so., .dll - не суть) некоторый набор С++ классов.
В связи с этим возникает ряд вопросов.
Существут ли канонический алгоритм на эту тему
(дабы избежать гемороя с искажением имен компилятором, и сопутствтующих граблей).
Прокатит ли подобная упаковка для template классов (ведь шаблоны по идее каждый раз компилируются по новой)? Будут ли проблеммы (и какие?) с inline-методами.
Спасибо, всем, кто сможет грамотно осветить тему.
МСВС 3.0/Linux Mandrake 8.0
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: ООП библиотека

Сообщение Zeus »

Сдаётся мне, что самое "каноническое" из универсального и самое универсальное из "канонического": фабрику классов хотя бы в виде простой функции в библиотеку положить.
А остальное - платформенно-языково зависимо.

Могу ошибаться.
Спасибо сказали:
MedVed
Сообщения: 112

Re: ООП библиотека

Сообщение MedVed »

Zeus писал(а):
30.03.2006 18:36
Сдаётся мне, что самое "каноническое" из универсального и самое универсальное из "канонического": фабрику классов хотя бы в виде простой функции в библиотеку положить.

Может, я чего недопонял. Ну, фабрику, допустим я положу.
А сам код классов в коем виде тогда распространять. :)
Собственно, есть работающее решение, когда я делаю extern "C" на все
экспортируемые функции. Но, какое-то оно... некрасивое, что-ли...
МСВС 3.0/Linux Mandrake 8.0
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: ООП библиотека

Сообщение serzh-z »

MedVed писал(а):
30.03.2006 22:43
Может, я чего недопонял. Ну, фабрику, допустим я положу.
А сам код классов в коем виде тогда распространять. :)
Собственно, есть работающее решение, когда я делаю extern "C" на все
экспортируемые функции. Но, какое-то оно... некрасивое, что-ли...


Э-э... А зачем его распространять? Код в в виде скомпилированного бинаря. Определения классов в заголовочном файле. Фабрика должна возвращать объект через обобщённый указатель.
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: ООП библиотека

Сообщение oav »

serzh-z писал(а):
31.03.2006 11:44
Э-э... А зачем его распространять? Код в в виде скомпилированного бинаря. Определения классов в заголовочном файле. Фабрика должна возвращать объект через обобщённый указатель.

Через обычный указатель нужного класса. Костыли конечно. Насколько я знаю gcc(вроде) & vc7.1 (точно) имеют соотв. расширения которые позволяют это автоматизировать.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: ООП библиотека

Сообщение serzh-z »

oav писал(а):
31.03.2006 12:09
Через обычный указатель нужного класса. Костыли конечно. Насколько я знаю gcc(вроде) & vc7.1 (точно) имеют соотв. расширения которые позволяют это автоматизировать.


Что автоматизировать? Написание функции extern "C" ... CreateObject()? Как следует из первого сообщения автора - расширения отпадают по причине непереносимости.
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: ООП библиотека

Сообщение oav »

serzh-z писал(а):
31.03.2006 12:16
oav писал(а):
31.03.2006 12:09

Через обычный указатель нужного класса. Костыли конечно. Насколько я знаю gcc(вроде) & vc7.1 (точно) имеют соотв. расширения которые позволяют это автоматизировать.


Что автоматизировать? Написание функции extern "C" ... CreateObject()? Как следует из первого сообщения автора - расширения отпадают по причине непереносимости.

Ну да! нахрена писать каждый раз один и тотже CreateObject для каждого класса структуры который хочешь заэкспортить? куда проще написать что-то типа

__declspec(dllexport) class AA
{
};
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: ООП библиотека

Сообщение serzh-z »

oav писал(а):
31.03.2006 14:04
__declspec(dllexport) class AA
{
};


Вообще-то речь о фабрике. А это уже будет полноценный экспорт с соответствующими граблями. См. первый пост.
Далее - зачем писать CreateObject() для каждого класса??? - если необходимо просто сделать выбор типа создаваемого класса.
Спасибо сказали: