URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3583
[ Назад ]

Исходное сообщение
"Экспорт класса"

Отправлено Szef , 12-Ноя-04 13:20 
Добрый день!
Не могу решить задачу - необходимо сделать динамическую библиотеку, которая написана на С++. Проблема в том, что я никак не могу экспортировать класс, чтобы потом его использовать..
Подскажите, как это сделать, чтобы средствами dlopen, dlsym (или другими какими), можно было бы использовать такую библиотеку.

Содержание

Сообщения в этом обсуждении
"Экспорт класса"
Отправлено klalafuda , 12-Ноя-04 13:36 
>Добрый день!
>Не могу решить задачу - необходимо сделать динамическую библиотеку, которая написана на
>С++. Проблема в том, что я никак не могу экспортировать класс,
>чтобы потом его использовать..
>Подскажите, как это сделать, чтобы средствами dlopen, dlsym (или другими какими), можно
>было бы использовать такую библиотеку.

---lib.h---
class foo {
public :
    foo();
    virtual ~foo();
};

extern "C" {
class foo *create_foo();
void delete_foo(class foo *);
};
---lib.h---

---lib.cc---
#include "lib.h"

class foo * create_foo() {
    return new foo();
}

void delete_foo(class foo *foo_) {
    delete foo_;
}
---lib.cc---

из своего приложения импортируете create_foo/delete_foo и через них создаете/удаляете экземпляры класса. за счет того, что функции доступа объявлены как "C", проблем с декарацией имен уже не будет. надеюсь, идея понятна.

// wbr


"Экспорт класса"
Отправлено Szef , 12-Ноя-04 15:30 
>>Добрый день!
>>Не могу решить задачу - необходимо сделать динамическую библиотеку, которая написана на
>>С++. Проблема в том, что я никак не могу экспортировать класс,
>>чтобы потом его использовать..
>>Подскажите, как это сделать, чтобы средствами dlopen, dlsym (или другими какими), можно
>>было бы использовать такую библиотеку.
>
>---lib.h---
>class foo {
>public :
>    foo();
>    virtual ~foo();
>};
>
>extern "C" {
>class foo *create_foo();
>void delete_foo(class foo *);
>};
>---lib.h---
>
>---lib.cc---
>#include "lib.h"
>
>class foo * create_foo() {
>    return new foo();
>}
>
>void delete_foo(class foo *foo_) {
>    delete foo_;
>}
>---lib.cc---
>
>из своего приложения импортируете create_foo/delete_foo и через них создаете/удаляете экземпляры класса. за
>счет того, что функции доступа объявлены как "C", проблем с декарацией
>имен уже не будет. надеюсь, идея понятна.
>
>// wbr
Хмм.. Очень интересная фишка, обязательно попробую... спасибо!
Но прикол ещё в том, что хочется этому классу наследовать... Как быть тогда?


"Экспорт класса"
Отправлено klalafuda , 12-Ноя-04 16:06 
>Хмм.. Очень интересная фишка, обязательно попробую... спасибо!
>Но прикол ещё в том, что хочется этому классу наследовать... Как быть
>тогда?

http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/C++-dlop...

ps: google is your friend :)

// wbr


"Экспорт класса"
Отправлено Szef , 12-Ноя-04 23:01 
>>Хмм.. Очень интересная фишка, обязательно попробую... спасибо!
>>Но прикол ещё в том, что хочется этому классу наследовать... Как быть
>>тогда?
>
>http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/C++-dlop...
>
>ps: google is your friend :)
>
>// wbr
Спасибо за ссылку, прочитал с интересом. Но по-моему там не описано решение моей проблемы. Может я неясно излагаю - поясню на примере.
В библиотеке находится класс A. Я хочу его пронаследовать (class B : public A) и использовать объект производного класса для дальнеёшей работы. А примеры с class factory functions, я так понял, создают и возвращают объект исходного(базового) класса. Или я не так понял?...


"Экспорт класса"
Отправлено Vladislav Lazarenko , 12-Ноя-04 23:12 
Солнце, все, что связано с наследование обрабатывается на этапе компиляции.  Нельзя с этими штуками играть в run-time ...

Хотя можно кое-что другое. Описываешь интерфейс, а в DLL этот класс наследуешь и переопределяешь... пишешь какую-то своб имплементацию.
Потом поинтеру базового класса присваиваешь инстанс своего мутантика) И, не подозревая ничего, о реализации .. работаешь.

Но наследовать черт знает что в run-time из DLL'ки (SO'шки) низя :)

-- WBR


"Экспорт класса"
Отправлено DeadMustdie , 14-Ноя-04 19:39 
>Солнце, все, что связано с наследование обрабатывается на этапе
>компиляции.  Нельзя с этими штуками играть в run-time ...
>

А если очень хочется, значит, есть два варианта:
- сменить язык программирования на язык с прямой поддержкой
метаобъектного протокола;
- поиграться с "отражениями" (reflection)
   http://www.vollmann.com/en/pubs/meta/meta/meta.html


"Экспорт класса"
Отправлено klalafuda , 15-Ноя-04 09:37 
>>Солнце, все, что связано с наследование обрабатывается на этапе
>>компиляции.  Нельзя с этими штуками играть в run-time ...
>>
>
>А если очень хочется, значит, есть два варианта:
> - сменить язык программирования на язык с прямой поддержкой
>метаобъектного протокола;
> - поиграться с "отражениями" (reflection)
>   http://www.vollmann.com/en/pubs/meta/meta/meta.html

- или не менять язык и оставаться в пределах C++, но взять уже готовый framework. например, CORBA.

// wbr