Autore Topic: Posizione di una libreria esterna  (Letto 195 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.608
  • Ne mors quidem nos iunget
    • Mostra profilo
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.608
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Posizione di una libreria esterna
« Risposta #1 il: 04 Settembre 2018, 18:45:47 »
La risposta che dà Gianluigi è corretta in via generale: ossia le librerie condivise .so possono essere richiamate in Gambas da qualsiasi percorso.
Va sottolineato che in tali casi (ossia quando non sono salvate nei percorsi "standard" ove il sistema normalmente salva le librerie condivise .so) bisognerà dichiarare con precisione il percorso ove la libreria esterna è memorizzata.

Nel caso di specie, sollevato nella Mailing List, funziona lo stesso, MA... ovviamente c'è il problema che nella parola-chiave "Library", utilizzata per dichiarare quale libreria esterna verrà utilizzata, NON è possibile inserire l'informazione "Application.Path".
Il caso indicato nella Mailing List, infatti, prevede che la libreria esterna codivisa sia contenuta nella cartella "Dati" del progetto/programma Gambas.
Ebbene, per risolvere il problema bisognerà manualmente o via codice copiare il file della libreria condivisa in (ad esempio) /tmp, avendo cura di impostare nella dichiarazione con la parola-chiave Library la cartella ove andremo a salvare la copia della libreria esterna (in questo esempio in /tmp).

Esempio pratico, in cui si ha una libreria esterna dinamica nella cartella "Dati" del nostro progetto:
Codice: [Seleziona]
Library "/tmp/mialibreria"

Private Extern FunzioneEsternaChefaQualcosa(valore As Integer) As Integer


Public Sub Main()

  Dim i As Integer

' Copia la libreria esterna contenuta dal progetto/programma nella cartella /tmp:'
  Copy "mialibreria.so" To "/tmp/mialibreria.so"

' Invoca la funzione esterna contenuta nella libreria esterna sopra copiata in /tmp:'
  i = FunzioneEsternaChefaQualcosa(100)

  Print i

End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.608
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Posizione di una libreria esterna
« Risposta #2 il: 05 Settembre 2018, 00:12:14 »
...poiché nella Mailing List si è alzato un risibile vespaio sulla opportunità di salvare la copia della libreria condivisa esterna nella cartella "/tmp", è bene far rilevare che tale cartella è una fra le miriadi opzioni possibili.
Nel codice precedente ho infatti detto che la scelta di "/tmp" era esemplificativa.
Ad ogni buon conto "/tmp" è in tali casi e per tali usi (...e non solo), poiché temporanea, la cartella che io preferisco.


La cartella temporanea è ovviamente preferibile, quando non si desidera che il file permanga anche dopo lo spegnimento del sistema. In tal caso la libreria esterna condivisa, da noi creata, dovrà essere generata almeno la prima volta che lanciamo il programma Gambas.
Facciamo un semplice esempio pratico: il programma Gambas crea il file sorgente di una breve libreria condivisa esterna, contenente una semplicissima funzione che svolge un'addizione. Successivamente genera la libreria condivisa esterna .so che sarà utilizzata nel programma Gambas.
Codice: [Seleziona]
Private Extern addiziona(i As Integer) As Integer In "/tmp/libcalc"   ' Dichiara la funzione esterna e la libreria che la contiene '


Public Sub Main()

  Dim i As Integer
 
' Va a creare la libreria condivisa: '
  Creaso()
 
  i = addiziona(1999)

  Print i

End


Private Procedure Creaso()   ' Attiva la procedura...'

'...per creare nella cartella /tmp il file sorgente della libreria condivisa, e...
  File.Save("/tmp/libcalc.c", "int addiziona(int i) {\n\n" &
            "   return i + 1;\n\n}")
 
'...per generare nella cartella /tmp la libreria condivisa:
  Shell "gcc -o /tmp/libcalc.so /tmp/libcalc.c -shared" Wait
 
End
Come si può notare, sia il file sorgente che la effettiva libreria condivisa esterna sono stati creati nella cartella /tmp; e da questa la libreria condivisa dovrà essere richiamata in Gambas.
« Ultima modifica: 09 Settembre 2018, 14:07:37 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »