Differenze tra le versioni di "Caricamento dinamico di librerie .so con il subsistema 'loadso' di SDL2"

Da Gambas-it.org - Wikipedia.
 
Riga 5: Riga 5:
 
<BR>Infatti si giunge ad avere una libreria dinamica condivisa esterna, da noi appositamente creata, che invoca alcune funzioni esterne della risorsa ''SDL2'', che a loro volta invocano una o più funzioni esterne (le quali sono in fondo la/le funzione/i che realmente ci interessano) di un'altra libreria dinamica condivisa. Insomma l'intero sistema sarebbe formato da tre risorse: il codice Gambas, la libreria esterna (da noi scritta) per gestire la libreria ''SDL2'' ed infine la libreria esterna richiamata e caricata dinamicamente dalla libreria ''SDL2'' .
 
<BR>Infatti si giunge ad avere una libreria dinamica condivisa esterna, da noi appositamente creata, che invoca alcune funzioni esterne della risorsa ''SDL2'', che a loro volta invocano una o più funzioni esterne (le quali sono in fondo la/le funzione/i che realmente ci interessano) di un'altra libreria dinamica condivisa. Insomma l'intero sistema sarebbe formato da tre risorse: il codice Gambas, la libreria esterna (da noi scritta) per gestire la libreria ''SDL2'' ed infine la libreria esterna richiamata e caricata dinamicamente dalla libreria ''SDL2'' .
  
E' necessario avere installata nel proprio sistema la libreria condivisa: " ''libSDL2-2.0.so.0.2800.5'' ".
+
E' necessario avere installata nel proprio sistema la libreria condivisa: " ''libSDL2-2.0.so.0.3000.0'' ".
  
 
Mostriamo, comunque, un esempio, nel quale si genererà una libreria dinamica condivisa esterna che chiama le funzioni esterne della risorsa ''SDL2'', le quali invocheranno la funzione esterna ''pow()'', appartenente alla libreria dinamica condivisa ''libm.so.6''. Alla libreria dinamica condivisa esterna, da noi creata, passeremo due valori di tipo ''Float'', che saranno successivamente passati alla funzione esterna ''pow()'', la quale restituirà il valore elaborato. Detto valore sarà restituito dalla nostra libreria esterna ''ad hoc'' al programma principale Gambas.
 
Mostriamo, comunque, un esempio, nel quale si genererà una libreria dinamica condivisa esterna che chiama le funzioni esterne della risorsa ''SDL2'', le quali invocheranno la funzione esterna ''pow()'', appartenente alla libreria dinamica condivisa ''libm.so.6''. Alla libreria dinamica condivisa esterna, da noi creata, passeremo due valori di tipo ''Float'', che saranno successivamente passati alla funzione esterna ''pow()'', la quale restituirà il valore elaborato. Detto valore sarà restituito dalla nostra libreria esterna ''ad hoc'' al programma principale Gambas.

Versione attuale delle 16:44, 18 mar 2024

Il subsistema loadso è una risorsa di SDL2 per il caricamento dinamico di librerie condivise .so in memoria.


Riportiamo l'uso in Gambas di questa risorsa più a fini didattici e di curiosità, poiché l'applicazione pratica risulta aggravata dalla creazione di una libreria esterna ad hoc, ove porre le funzioni necessarie appartenenti alla libreria SDL2, e che dovrà essere chiamata nel codice Gambas con la necessaria parola chiave Extern.
Infatti si giunge ad avere una libreria dinamica condivisa esterna, da noi appositamente creata, che invoca alcune funzioni esterne della risorsa SDL2, che a loro volta invocano una o più funzioni esterne (le quali sono in fondo la/le funzione/i che realmente ci interessano) di un'altra libreria dinamica condivisa. Insomma l'intero sistema sarebbe formato da tre risorse: il codice Gambas, la libreria esterna (da noi scritta) per gestire la libreria SDL2 ed infine la libreria esterna richiamata e caricata dinamicamente dalla libreria SDL2 .

E' necessario avere installata nel proprio sistema la libreria condivisa: " libSDL2-2.0.so.0.3000.0 ".

Mostriamo, comunque, un esempio, nel quale si genererà una libreria dinamica condivisa esterna che chiama le funzioni esterne della risorsa SDL2, le quali invocheranno la funzione esterna pow(), appartenente alla libreria dinamica condivisa libm.so.6. Alla libreria dinamica condivisa esterna, da noi creata, passeremo due valori di tipo Float, che saranno successivamente passati alla funzione esterna pow(), la quale restituirà il valore elaborato. Detto valore sarà restituito dalla nostra libreria esterna ad hoc al programma principale Gambas.

Library "/tmp/libadhoc"

' double Potenza(double f1, double f2)
' Chiama la funzione della libreria, da noi scritta, contenente il necessario codice per invocare la funzione esterna pow() della libreria libm.so.6
Private Extern Potenza(n As Float, pot As Float) As Float


Public Sub Main()
 
 Dim f As Float
 
 CreaSo()
 
 f = Potenza(3.05, 1.98)
 If f < 0 Then Error.Raise("Errore nella chiamata della libreria esterna !")
   
 Print "Valore di 3.05 ^ 1.98 =  "; f
  
End


Private Procedure CreaSo()
 
 File.Save("/tmp/libadhoc.c", "#include <stdio.h>\n" &
           "#include <stdlib.h>\n" &
           "#include <SDL2/SDL.h>\n" &
           "\n\n" &
        "double Potenza(double f1, double f2) {\n\n" &
           "   void *handle;\n" &
           "   double (*funzione)(double, double);\n" &
           "   double d;\n" &
           "\n\n" &
           "   /* Apre la libreria esterna e salva l'handle */\n" &
           "   handle = SDL_LoadObject(\"libm.so.6\");\n" &
           "   if (handle == NULL) {\n" &
           "      printf(\"Impossibile aprire la libreria esterna !\");\n" &
           "      SDL_UnloadObject(handle);\n" &
           "      return -1;\n   }\n" &
           "\n\n" &
           "   /* Carica la funzione esterna 'pow()' */\n" &
           "   funzione = (double (*)(double, double))SDL_LoadFunction(handle, \"pow\");\n" &
           "   if (funzione == NULL) {\n" &
           "      printf(\"Impossibile caricare la funzione esterna 'pow()' !\");\n" &
           "      SDL_UnloadObject(handle);\n" &
           "      return -2;\n   }\n" &
           "\n\n" &
           "   /* Caricata la funzione della libreria esterna, viene dunque invocata */\n" &
           "   d = funzione(f1, f2);\n" &
           "\n\n" &
           "   /* Chiude la libreria esterna */\n" &
           "   SDL_UnloadObject(handle);\n" &
           "\n\n" &
           "   return d;\n\n}")
          
 Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC `sdl2-config --cflags --libs`" Wait
   
End


Riferimenti