Добрый день!
Не могу решить задачу - необходимо сделать динамическую библиотеку, которая написана на С++. Проблема в том, что я никак не могу экспортировать класс, чтобы потом его использовать..
Подскажите, как это сделать, чтобы средствами dlopen, dlsym (или другими какими), можно было бы использовать такую библиотеку.
>Добрый день!
>Не могу решить задачу - необходимо сделать динамическую библиотеку, которая написана на
>С++. Проблема в том, что я никак не могу экспортировать класс,
>чтобы потом его использовать..
>Подскажите, как это сделать, чтобы средствами 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
>>Добрый день!
>>Не могу решить задачу - необходимо сделать динамическую библиотеку, которая написана на
>>С++. Проблема в том, что я никак не могу экспортировать класс,
>>чтобы потом его использовать..
>>Подскажите, как это сделать, чтобы средствами 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
Хмм.. Очень интересная фишка, обязательно попробую... спасибо!
Но прикол ещё в том, что хочется этому классу наследовать... Как быть тогда?
>Хмм.. Очень интересная фишка, обязательно попробую... спасибо!
>Но прикол ещё в том, что хочется этому классу наследовать... Как быть
>тогда?http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/C++-dlop...
ps: google is your friend :)
// wbr
>>Хмм.. Очень интересная фишка, обязательно попробую... спасибо!
>>Но прикол ещё в том, что хочется этому классу наследовать... Как быть
>>тогда?
>
>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, я так понял, создают и возвращают объект исходного(базового) класса. Или я не так понял?...
Солнце, все, что связано с наследование обрабатывается на этапе компиляции. Нельзя с этими штуками играть в run-time ...Хотя можно кое-что другое. Описываешь интерфейс, а в DLL этот класс наследуешь и переопределяешь... пишешь какую-то своб имплементацию.
Потом поинтеру базового класса присваиваешь инстанс своего мутантика) И, не подозревая ничего, о реализации .. работаешь.Но наследовать черт знает что в run-time из DLL'ки (SO'шки) низя :)
-- WBR
>Солнце, все, что связано с наследование обрабатывается на этапе
>компиляции. Нельзя с этими штуками играть в run-time ...
>А если очень хочется, значит, есть два варианта:
- сменить язык программирования на язык с прямой поддержкой
метаобъектного протокола;
- поиграться с "отражениями" (reflection)
http://www.vollmann.com/en/pubs/meta/meta/meta.html
>>Солнце, все, что связано с наследование обрабатывается на этапе
>>компиляции. Нельзя с этими штуками играть в run-time ...
>>
>
>А если очень хочется, значит, есть два варианта:
> - сменить язык программирования на язык с прямой поддержкой
>метаобъектного протокола;
> - поиграться с "отражениями" (reflection)
> http://www.vollmann.com/en/pubs/meta/meta/meta.html- или не менять язык и оставаться в пределах C++, но взять уже готовый framework. например, CORBA.
// wbr