Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it L'avatar di xshell
    Registrato dal
    Apr 2008
    Messaggi
    157

    [C++] - Libreria statica e dinamica

    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.

  2. #2
    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.

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    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

  4. #4
    Utente di HTML.it L'avatar di xshell
    Registrato dal
    Apr 2008
    Messaggi
    157
    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#.

  5. #5
    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
    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).
    e caricarla sull'eseguibile principale?
    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.
    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#.
    Si possono creare librerie dinamiche, ma la questione lì è molto diversa.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di xshell
    Registrato dal
    Apr 2008
    Messaggi
    157
    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?

  7. #7
    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?
    Quello contenente i prototipi delle funzioni della libreria.
    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?
    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).
    codice:
    #pragma comment (lib, "percorsoenomelibreria.lib")
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it L'avatar di xshell
    Registrato dal
    Apr 2008
    Messaggi
    157
    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?

  9. #9
    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?
    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:
    codice:
    //Mialibreria.h
    int Somma(int a, int b);
    codice:
    //Mialibreria.cpp
    #include "Mialibreria.h"
    int Somma(int a, int b)
    {
        return a + b;
    }
    Compilando questo progetto come libreria statica ottieni Mialibreria.lib. A questo punto nell'altro progetto scriverai:
    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;
    }
    . Per funzionare ovviamente bisogna dire al linker di collegare anche Mialibreria.lib (di cui dovrai indicare ovviamente anche il percorso).
    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.
    Il codice #pragma comment è valido sempre, su qualsiasi sistema operativo e compilatore?
    No, vale solo per Microsoft Visual C++.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it L'avatar di xshell
    Registrato dal
    Apr 2008
    Messaggi
    157
    Ho capito tutto adesso. Gentilissimo, grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.