Newsgroup: it.comp.os.linux.development
Titolo: Libreria dinamica e C++

Ciao a tutti, sto provando a sperimentare un po' con la libdl, per
implementare una specie di plugin nelle mie applicazioni. Quello che
vorrei fare è racchiudere tutte le classi che riguardano un certo aspetto
di un programma in una libreria condivisa e poi utilizzarla a run-time.
Finora non credo di aver detto nulla di innovativo ;-)
Il problema è che quando cerco di chiamare i metodi sugli oggetti che mi
vengono restituiti da una funzione linkata come 'extern "C"', al momento
della compilazione il linker si incazza in quanto non riesce a trovare i
metodi..come si risolve questo problema? Esempio:
//--lib.h--
class libreria{
	public:
		libreria();
		void ciSei();
};
//--lib.cpp--
#include "lib.h"
#include <iostream>
libreria::libreria(){
	std::cout<<"OK,OGGETTO CREATO"<<std::endl;
}
void ciSei(){
	std::cout<<"SI, CI SONO"<<std::endl;
}
extern "C" libreria *getObject(){return new libreria();}
$ g++ -shared -fPIC lib.cpp -o libreria.so
//--main.cpp--
#include "lib.h"
#include <iostream>
#include <dlfcn.h>
using namespace std;
int main(){
	void *l=dlopen("./libreria.so",RTLD_NOW);
	if (!l)
		abort();
	typedef libreria *(*crea)();
	crea getinst=(crea) dlsym(l,"getObject");
	if (!getinst)
		abort();
	libreria *lb=getinst();
	lb->cisei();
	return 0;
}
$ g++ -Wall main.cpp -ldl && ./a.out
/tmp/ccJA0m1W.o(.text+0x1b4): In function `main':
: undefined reference to `libr::ping()'
collect2: ld returned 1 exit status
$
Sto cercando da un'ora nelle opzioni di ld, ma finora nulla...credo che si
tratti di una stupidaggine, qualcuno me la dice?
Grazie!

 metodi..come si risolve questo problema?
Il linker non può rimandare la risoluzione delle chimate alle funzioni 
membro. D'altra parte, se ci pensi, non ha nemmeno molto senso caricare una 
libreria dinamica a runtime e al contempo #includere i suoi header 
specifici in fase di compilazione.
Dovresti, invece, disaccoppiare maggiormente interfaccia e implementazione 
e sfruttare il polimorfismo.
La funzione factory della libreria caricata a runtime potrebbe, quindi, 
restituire oggetti che sono instanze di classi concrete derivate da una 
classe base astratta. Quest'ultima sarà tutto ciò che il programma dovrà 
conoscere per adoperare gli oggetti costruiti nella libreria.
Max



Infatti, lo credevo anche io. In effetti non mi serve nemmeno includere
gli header degli oggetti di libreria, quello che volevo fare era un'altra
cosa, in pratica volevo fornire al metodo factory un puntatore
all'applicazione e fare in modo che esso registrasse il plugin
nell'applicazione e inizializzasse il tutto. In effetti funzionava, il
menu veniva aggiornato (uso wxWidgets), però avevo il problema di
collegare gli event handler, mi andava sempre in segfault. Così ho
pensato di fare qualche prova con gli oggetti direttamente :-)
C'è qualcuno che conosce wxWidgets che è riuscito a fare qualcosa del
genere? In pratica vorrei fornire al metodo factory un puntatore alla
wxApp corrente, in modo che tale metodo aggiunge il suo sottomenu al menu
principale e ( tramite Connect()) connette gli handler degli eventi agli
oggetti creati all'interno della libreria. E' possibile fare una cosa del
genere?

 Finora non credo di aver detto nulla di innovativo ;-)
Se vuoi fare un sistema a plugin c'è un articolo interessante su
lunaticsystems.de
C'è una libreria in giro, tale spl, ma non l'ho provata.
Se ti interessa posso postare parte di un sistema ispirato a quello di
lunaticsystem, sviluppato con MFC.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail** 
-<! Gesu' e' morto per i nostri peccati.  Non rendiamo inutile il suo
		martirio non commettendone !>-

 sviluppato con MFC.
Grazie ho già letto quell'articolo, ma in effetti il post originale
riguardava solo delle prove che stavo facendo. La mia esigenza è quella
di far funzionare i plugin con il sistema wxWidgets, in modo che ogni
plugin si "registri" da solo presso l'applicazione principale, si
inserisca nel menu e risponda agli eventi generati dalle voci di menu
inserite. Ciò che non riesco a fare è proprio l'ultima cosa, in quanto
ogni volta che clicco sul menu, mi va in segfault, sia sotto linux che
sotto windows e non riesco a capire perchè!
Grazie comunque!