Spiegazioni librerie .a .dll .h

di il
12 risposte

Spiegazioni librerie .a .dll .h

Salve a tutti,

piano piano mi sto avvicinando nel mondo della programmazione attraverso il linguaggio C. Ho dei dubbi che non riesco a risolvere tramite la semplice navigazioni in forum o sul web. Io sto usando Code:Block come IDE, sto sviluppando una serie di algoritmi: ricerca, ordinamento, funzioni matematiche utilizzando quindi delle strutture dati apposite, ora questi progetti utilizzano delle funzioni comuni, esempio il confronto, lo scambio di valore di due variabili o gli include alle funzioni standard, che vorrei mettere come libreria in cui avrà un file sorgente, il quale, modifico quello, e tutti i progetti visualizzeranno le modifiche fatte. Oppure 2 o più algoritmi hanno bisogno della medesima definizione di struttura dati con relative funzioni base per la sua gestione. L'unica cosa che faccio ora è copiare il file .h nella cartella corrente di ogni progetto creando un intreccio assurdo e se devo andare a modificare quel file .h, con il rispettivo .c, è un vero caos. Ho creato con Code:Block un progetto per creare una libreria statica e poi nelle opzioni del linker ho aggiunto il suo pathname ma i progetti al suo interno non vedono le funzioni ne le definizioni. Sono andato in palla non riesco a capire proprio il funzionamento delle librerie .a, la differenza con le dll e il linker che le collega tutte.
Sto impazzendo e mi servirebbe proprio una bella spiegazione per indirizzarmi sulla strada giusta.
Grazie infinite per un vostro eventuale chiarimento, Buon Natale,

fagix

12 Risposte

  • Re: Spiegazioni librerie .a .dll .h

    Dovrai prima di tutto includere l'header che decori la static lib (proprio come si farebbe per una dll o piu semplicemente per un file .c comune al progetto) o in alternativa dovrai dichiarare i vari prototipi di funzione contenuti in tali file.
    Secondo nel linker devi specificare il path della lib.a(come faresti per la dll)
    Una libreria statica e una dinamica sono molto simili tranne per una cosa,la prima include tutto il codice direttamente nel file .exe finale, la seconda invece rimane separata nella .dll.
  • Re: Spiegazioni librerie .a .dll .h

    Ok quindi sia con una static library o dinamic library io devo includere il file header (.h ) per ogni progetto, giusto? Per la modifica del file, invece, viene aggiornato a tutti i progetti oppure devo ricompilare il file .h con il suo .c per farlo diventare per esempio una .a e poi manualmente riandare a sostituire il .h per ogni progetto??

    Inoltre a me programmatore che vantaggi mi da la creazione di una .dll contrapposta ad una .a??

    Grazie mille per la tua attenzione, gentilissimo!

    Fagix
  • Re: Spiegazioni librerie .a .dll .h

    Anche nelle dll linki le .a e non direttamente la .dll almeno che non la carichi manualmente con la loadlibrary.
    Solo che le statiche vengono inglobate nel file.exe mentre le dinamiche rimangono nella .dll

    L'header una volta incluso non va ricompilato,mentre se modifica la libreria allora si va ricompilato sia il progetto libreria sia il propio exe in entrambi i casi.

    Per rendere tutto molto semplice puoi quasi immaginare che le librerie siano un insieme di file.c li si compila e nel proprio progetto invece di inserire tutti i file.c metti solo il .a.
    L'header serve invece per indicare cosa tu utilizzi e va incluso dove serve.

    Sono cose spiegate meglio sui libri però.
  • Re: Spiegazioni librerie .a .dll .h

    Ok ma è molto inefficiente il fatto di andare a ricompilare ogni volta la mia libreria .a alla minima modifica del .c per poi per ogni progetto andare a cambiare il .h nel caso ci siano cambiamenti drastici (es. prototipi di funzioni diversi). Una mezza soluzione potrebbe essere nel mettere il mio file.h nella specifica directory che mi permette di strutturare il codice nella parte dell'inclusione con " <miofile.h>" e non come faccio adesso "miofile.h"; così facendo sostituisco una sola volta l'header visibile a tutti i progetti. Quale sarebbe la cartella di tutti i file header??

    Nel progetto di una dll nella sua compilazione, quindi, si genera una .a necessaria al suo utilizzo? Però di solito vedo sempre la dll con un file.exe .

    Mi potresti indicare dei buon libri da leggere riguardanti appunto compilazioni, linker, loader, librerie dinamiche e statiche anche su diversi OS?

    Grazie mille veramente vbextreme, gentilissimo,

    Fagix
  • Re: Spiegazioni librerie .a .dll .h

    Tu puoi specificare al compilatore qualsiasi directory dove andare a ricercare sia gli header che le librerie.
    Agli inizi però forse è piu semplice copiare l'header nella directory "..\compilatore\include" e le librerie.a in "..\compilatore\lib"
    cosi da fare semplicemente "#include<mialib.h>"
    Nel progetto di una dll nella sua compilazione, quindi, si genera una .a necessaria al suo utilizzo
    Si,in c/c++ si linkano i .a e non le .dll
    Quando compili una libreria .dll otterrai:
    "..\mioprogetto\bin\debug o release\"
    "mioprogetto.a" (gcc) o "mioprogetto.lib" (vs)
    "mioprogetto.def"
    "mioprogetto.dll"
    Mi potresti indicare dei buon libri da leggere riguardanti appunto compilazioni, linker, loader, librerie dinamiche e statiche anche su diversi OS?
    Per prima cosa dovresti leggerti il manuale del tuo compilatore,li è spiegato un pò tutto.
    Le dll dinamiche esistono solo in windows quindi puoi fare riferimento all'msdn per imparare qualcosa a riguardo.
  • Re: Spiegazioni librerie .a .dll .h

    vbextreme ha scritto:


    Le dll dinamiche esistono solo in windows ...
    Ma Linux utilizza le shared libraries, i file .so
  • Re: Spiegazioni librerie .a .dll .h

    Capisco, a patto che la lib.a abbia lo stesso nome del file header.h dato che con una sola stringa
    es. "include<mialib.h>" riesce a linkare la libreria statica. Ora però mi è venuto un dubbio a che mi serve il mio file.a se posso includere il .h direttamente nella cartella "../compilatore/include/" e quando lo devo modificare vado nel progetto ricompilo il mio .c e .h e poi vado di nuovo a sostituire il file.h??
    Forse perché non riesce a vedere i miei file.c con i relativi corpi delle funzioni e come hai detto tu:
    Per rendere tutto molto semplice puoi quasi immaginare che le librerie siano un insieme di file.c li si compila e nel proprio progetto invece di inserire tutti i file.c metti solo il .a.
    L'header serve invece per indicare cosa tu utilizzi e va incluso dove serve.
    giusto?

    Farò un pò di prove con le .dll per iniziare almeno a crearci un bel progetto e poi leggere un bel pò.
    Le shared library in linux si comportano allo stesso modo delle dll di Windows?

    Grazie mille per avermi indirizzato sulla giusta strada,

    Fagix
  • Re: Spiegazioni librerie .a .dll .h

    Ma Linux utilizza le shared libraries, i file .so
    Esatto,conferma che le .dll esistono solo in windows.
    Sono strutturalmente diverse anche se il loro scopo è il medesimo.
    es. "include<mialib.h>" riesce a linkare la libreria statica
    No forse mi sono espresso male.
    Cerco di semplificare una cosa assai complessa:
    Quando scrivi il codice tu puoi scriverlo su piu file e adirittura su piu librerie,quando però il compilatore analizza un file.c come fa a sapere se quella funzione esiste oppure no?
    Semplice non lo sa almeno che tu non lo dica esplicitamente con un prototipo di funzione,ovvero informi il compilatore che quella funzione esiste in un'altra parte del codice,il compilatore cortesemente risponde senza darti nessun errore.
    Quando poi si hanno diversi prototipi e quant'altro un programmatore può decidere di infilarli dentro un header,questo serve a semplificare la scrittura del codice e a non dover scrivere ogni volta gli stessi prototipi in ogni file.c,ma semplicemente includeremo l'header.
    Cosa succede se la funzione non è in un file.c ma è in una libreria? il compilatore darebbe errore se usiamo una funzione che è stata prototipizzata ma che non esiste.
    Qui entra in gioco il linker,noi gli diamo in pasto un file .a o .lib(non tramite include ma dando il percorso della libreria.a) e lui lo ingloba nel progetto le funzioni mancanti cosi il compilatore è felice e contento di trovare tutti sti biscottini che preso dall'emozione si dimentica di scatenare l'ira funesta degli errori.

    Riassumendo quando crei una libreria dinamica ti serviranno tre file la .dll , la .a e il .h
    Il .h serve per il codice non c'è bisogno quindi di ricompilare la libreria se modifichi solo ed esclusivamente tale file.
    Il .a serve per linkare la libreria se modifichi codice della libreria allora dovrai ricompilarla.
    La .dll è la reale libreria che verrà caricata nel momento dell'avvio del programma.

    Nelle statiche non hai bisogno della .dll perchè il codice viene inglobato all'interno del tuo .exe quindi il file exe ha già tutto quello necessario per essere eseguito.


    Discorsi cosi complicati però è meglio studiarli sui libri perchè sono difficili da trattare sui forum.
  • Re: Spiegazioni librerie .a .dll .h

    vbextreme ha scritto:


    Esatto,conferma che le .dll esistono solo in windows.
    E chi ha detto il contrario?
    se il loro scopo è il medesimo.
    Ah ... quindi, per completezza, era bene ricordarle ...
  • Re: Spiegazioni librerie .a .dll .h

    Giusto era solo che non volevo mettere troppa carne sul fuoco.Volevo evitare di dover spiegare cosa differenzia una Dynamic Link Library(sotto windows) e una Shared Library(sotto linux).(Fortuna che non l'ha chiesto....)
    Potevi delucidarlo meglio nel tuo messaggio,sai che io nell'italiano non me la cavo molto bene...
  • Re: Spiegazioni librerie .a .dll .h

    Ok, penso di aver capito tutto di quello che ho bisogno, forse quando farò la mia prima dll chiederò una mano!!

    La differenza delle shared con le dll me la vado a leggere da solo senza che posto altri messaggi per domandarlo, ora che ho capito meglio le librerie, penso sia più facile approfondire!!

    grazie mille gentilissimo per tutta la tua spiegazione,

    da Fagix
  • Re: Spiegazioni librerie .a .dll .h

    Ma figurati oltre che essere stato natale oggi è il mio "buon non compleanno...." anche quello di oregon( ).....
Devi accedere o registrarti per scrivere nel forum
12 risposte