Differenze tra le versioni di "Chiamare funzioni esterne mediante le risorse della libreria dlfcn.h"

Da Gambas-it.org - Wikipedia.
 
(3 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
La libreria ''dlfcn.h'' è un'interfaccia, scritta in C, per il caricamento del collegamento dinamico di librerie condivise .so in memoria.
+
La libreria dichiarata nel file d'intestazione ''dlfcn.h'' è un'interfaccia, scritta in C, 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 dichiarata nel file d'intestazione ''dlfcn.h'', e che dovrà essere chiamata nel codice Gambas con la necessaria parola chiave ''Extern''.
 +
<BR>Infatti si giunge ad avere una libreria dinamica condivisa esterna, da noi appositamente creata, che invoca alcune funzioni esterne della libreria dichiarata nel file d'intestazione ''dlfcn.h'', 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 dichiarata nel file d'intestazione ''dlfcn.h'' ed infine la libreria esterna richiamata e caricata dinamicamente dalla libreria dichiarata nel file d'intestazione ''dlfcn.h'' .
  
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 ala libreria ''dlfcn.h'', e che dovrà essere chiamata nel codice Gambas con la necessaria parola chiave ''Extern''.
+
Mostriamo, comunque, un esempio, nel quale si genererà una libreria dinamica condivisa esterna che chiama le funzioni esterne della libreria ''dlfcn.h'', le quali invocheranno la funzione esterna "pow()", appartenente alla libreria condivisa ''libm.so.6''. Alla libreria 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.
<BR>Infatti si giunge ad avere una libreria dinamica condivisa esterna, da noi appositamente creata, che invoca alcune funzioni esterne della libreria ''dlfcn.h'', 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 ''dlfcn.h'' ed infine la libreria esterna richiamata e caricata dinamicamente dalla la libreria ''dlfcn.h'' .
 
 
 
 
 
Mostriamo, comunque, un esempio, nel quale si genererà una libreria dinamica condivisa esterna che chiama le funzioni esterne della libreria ''dlfcn.h'', 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"
 
  Library "/tmp/libadhoc"
 
   
 
   
 
  <FONT Color=gray>' ''double Potenza(double f1, double f2)''
 
  <FONT Color=gray>' ''double Potenza(double f1, double f2)''
  ' ''Chiama la funzione esterna pow() della libreria libm.so.6''</font>
+
  ' ''Chiama la funzione della libreria, da noi scritta, contenente il necessario codice per invocare la funzione esterna pow() della libreria libm.so.6''</font>
 
  Private Extern Potenza(n As Float, pot As Float) As Float
 
  Private Extern Potenza(n As Float, pot As Float) As Float
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim f As Float
 
   Dim f As Float
Riga 25: Riga 23:
 
   Print "Valore di 3.05 ^ 1.98 =  "; f
 
   Print "Valore di 3.05 ^ 1.98 =  "; f
 
    
 
    
  '''End'''
+
  End
 
 
   
 
   
  '''Private''' Procedure CreaSo()
+
  Private Procedure CreaSo()
 
    
 
    
 
   File.Save("/tmp/libadhoc.c", "#include <stdio.h>\n" &
 
   File.Save("/tmp/libadhoc.c", "#include <stdio.h>\n" &
Riga 61: Riga 58:
 
   Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC -ldl" Wait
 
   Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC -ldl" Wait
 
      
 
      
  '''End'''
+
  End
 
 
  
  

Versione attuale delle 09:51, 11 giu 2023

La libreria dichiarata nel file d'intestazione dlfcn.h è un'interfaccia, scritta in C, 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 dichiarata nel file d'intestazione dlfcn.h, 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 libreria dichiarata nel file d'intestazione dlfcn.h, 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 dichiarata nel file d'intestazione dlfcn.h ed infine la libreria esterna richiamata e caricata dinamicamente dalla libreria dichiarata nel file d'intestazione dlfcn.h .

Mostriamo, comunque, un esempio, nel quale si genererà una libreria dinamica condivisa esterna che chiama le funzioni esterne della libreria dlfcn.h, le quali invocheranno la funzione esterna "pow()", appartenente alla libreria condivisa libm.so.6. Alla libreria 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 <dlfcn.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 = dlopen(\"libm.so.6\", RTLD_NOW);\n" &
           "   if (handle == NULL) {\n" &
           "      printf(\"dlopen fallita: %s\\n\",dlerror());\n" &
           "      return -1;\n   }\n" &
           "\n\n" &
           "   /* Cerca di trovare l'indirizzo della funzione */\n" &
           "   funzione = dlsym(handle,\"pow\");\n" &
           "   if (funzione == NULL) {\n" &
           "      printf(\"dlsym fallita: %s\\n\",dlerror());\n" &
           "      return -2;\n   }\n" &
           "\n\n" &
           "   /* Trovata la funzione della libreria esterna, viene dunque invocata */\n" &
           "   d = funzione(f1, f2);\n" &
           "\n\n" &
           "   /* Chiude la libreria esterna */\n" &
           "   dlclose(handle);\n" &
           "\n\n" &
           "   return d;\n\n}")
           
 Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC -ldl" Wait
    
End


Riferimenti