Ciao.
Mi sapreste spiegare gentilmente qual'è la differenza sostanziale tra libreria statica (.lib) e dinamica (.dll), come crearle e come collegarsi ad esse con programmi e classi?
Grazie.
Ciao.
Mi sapreste spiegare gentilmente qual'è la differenza sostanziale tra libreria statica (.lib) e dinamica (.dll), come crearle e come collegarsi ad esse con programmi e classi?
Grazie.
Una libreria statica contiene del codice che verrà incluso staticamente nell'eseguibile che la linkerà, mentre una libreria dinamica viene caricata in memoria al momento del caricamento dell'eseguibile che la richiede e il suo codice resta separato, non viene incluso nell'eseguibile; infatti se usi una libreria statica non la devi distribuire (il codice necessario viene incluso direttamente nell'eseguibile), mentre se usi una libreria dinamica essa deve essere sempre presente al momento dell'esecuzione del programma.
Per crearle e collegarsi ad esse la procedura varia a seconda del sistema operativo, del linguaggio e del compilatore che impieghi.
Amaro C++, il gusto pieno dell'undefined behavior.
Se usi una libreria statica, verranno importate solo le funzioni che effettivamente usi.
"Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)
"Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)
http://xvincentx.netsons.org/programBlog
Grazie ad entrambi per le informazioni. Io scrivo in C++, con Visual Studio 2008. Per quel che devo fare, sono più orientato verso una libreria statica. Come posso crearla e caricarla sull'eseguibile principale? Sapete anche se si possono creare librerie statiche o dinamice su C#? Finora non ne ho sentito parlare, ma quando avrò imparato bene il C++, mi piacerebbe imparare il C#.
Usa il progetto libreria statica, e inserisci in un header tutti i prototipi delle funzioni che vuoi mettere a disposizione. Quindi compila (in modalità debug e/o release).Originariamente inviato da xshell
Grazie ad entrambi per le informazioni. Io scrivo in C++, con Visual Studio 2008. Per quel che devo fare, sono più orientato verso una libreria statica. Come posso crearla
Includi nei file che necessitano delle funzioni della libreria statica l'header in questione e aggiungi alle impostazioni del linker tra i file aggiuntivi da linkare la tua libreria.e caricarla sull'eseguibile principale?
Si possono creare librerie dinamiche, ma la questione lì è molto diversa.Sapete anche se si possono creare librerie statiche o dinamice su C#? Finora non ne ho sentito parlare, ma quando avrò imparato bene il C++, mi piacerebbe imparare il C#.
Amaro C++, il gusto pieno dell'undefined behavior.
Okay. Allora, ho provato con Visual Studio e compilando un codice d'esempio, mi è saltato fuori il file "mialibreria.lib". Quello che non ho ben chiaro è come poter richiamare le funzioni in essa contenuta. Hai detto che nel codice sorgente di un programma, devo includere il file d'intestazione (*.h)... ma quale file di intestazione? Quello che originariamente costituiva la libreria? Ad esempio, sicuramente conoscerai la libreria "zlib.lib", che è utilizzata per comprimere i file in *.gz, se non erro... come faccio a utilizzarla nel mio programma? Devo andare nelle opzioni di Visual Studio è indicargli la posizione?
Quello contenente i prototipi delle funzioni della libreria.Originariamente inviato da xshell
Okay. Allora, ho provato con Visual Studio e compilando un codice d'esempio, mi è saltato fuori il file "mialibreria.lib". Quello che non ho ben chiaro è come poter richiamare le funzioni in essa contenuta. Hai detto che nel codice sorgente di un programma, devo includere il file d'intestazione (*.h)... ma quale file di intestazione?
Devi andare nelle proprietà del progetto, da qualche parte nelle impostazioni del linker c'è una casella in cui aggiungere le dipendenze aggiuntive. In alternativa all'inizio del file .C o .CPP puoi usare #pragma comment (non standard).Quello che originariamente costituiva la libreria? Ad esempio, sicuramente conoscerai la libreria "zlib.lib", che è utilizzata per comprimere i file in *.gz, se non erro... come faccio a utilizzarla nel mio programma? Devo andare nelle opzioni di Visual Studio è indicargli la posizione?
codice:#pragma comment (lib, "percorsoenomelibreria.lib")
Amaro C++, il gusto pieno dell'undefined behavior.
Credo di avere un po' di confusione... ricapitolando:
Io creo dei file (*.cpp, *.h) e li compilo per ottenere il file "libreria.lib". Una volta che si ha la libreria, scrivo un'altro file che contiene i prototipi della libreria. In quest'ultimo file che cosa devo includere? Niente di particolare? Poi, scrivo il mio programma principale, che deve utilizzare quella libreria, includo il file con i prototipi. Il codice #pragma comment è valido sempre, su qualsiasi sistema operativo e compilatore?
Di solito in realtà non scrivi un file separato, ma lo stesso che usi nel compilare la libreria statica. Ti faccio un esempio estremamente banale di libreria statica che capisci meglio:Originariamente inviato da xshell
Credo di avere un po' di confusione... ricapitolando:
Io creo dei file (*.cpp, *.h) e li compilo per ottenere il file "libreria.lib". Una volta che si ha la libreria, scrivo un'altro file che contiene i prototipi della libreria. In quest'ultimo file che cosa devo includere? Niente di particolare?
codice://Mialibreria.h int Somma(int a, int b);Compilando questo progetto come libreria statica ottieni Mialibreria.lib. A questo punto nell'altro progetto scriverai:codice://Mialibreria.cpp #include "Mialibreria.h" int Somma(int a, int b) { return a + b; }
. Per funzionare ovviamente bisogna dire al linker di collegare anche Mialibreria.lib (di cui dovrai indicare ovviamente anche il percorso).codice://Mioeseguibile.cpp #include <iostream> #include "Percorso/Mialibreria.h" //Percorso è il percorso in cui si trova il file in questione using namespace std; int main() { int a, b; cin>>a; cin>>b; cout<<Somma(a,b); return 0; }
Se sei su Microsoft Visual C++ puoi evitare di smanettare direttamente con il linker o con le proprietà del progetto usando il #pragma di cui sopra.
No, vale solo per Microsoft Visual C++.Il codice #pragma comment è valido sempre, su qualsiasi sistema operativo e compilatore?
Amaro C++, il gusto pieno dell'undefined behavior.
Ho capito tutto adesso. Gentilissimo, grazie.