2009-07-14 15 views
13

Sono nuovo del C++ e c'è qualcosa che non riesco a ottenere. In C#, se voglio usare una libreria esterna, per esempio log4net, aggiungo semplicemente un riferimento alla DLL di log4net e i suoi membri sono automaticamente disponibili per me (e in IntelliSense). Come posso farlo in C++ non gestito?Come "aggiungere riferimento" in C++

risposta

23

Spesso la libreria viene fornita con 1) un file di intestazione (.h) e 2) un file .lib in aggiunta al file .dll.

Il file di intestazione è # incluso nel codice, per consentire l'accesso alle dichiarazioni di tipo e funzione nella libreria.

Il file .lib è collegato all'applicazione (proprietà del progetto -> linker -> input, dipendenze aggiuntive).

Il file .lib di solito contiene stub semplici che caricano automaticamente la DLL e inoltrano le chiamate alla funzione.

Se non si dispone di un file .lib, sarà necessario utilizzare la funzione LoadLibrary per caricare dinamicamente la DLL.

+0

Più approfondito della mia risposta. Vorrei anche aggiungere che, se stai usando LoadLibrary, non puoi semplicemente chiamare le funzioni per nome. Devi fare un attacco in ritardo. –

+1

Vedo che sono di nuovo incompleto. LoadLibrary restituisce un handle che è possibile passare a GetProcAddress, che fornisce un puntatore reale. Puoi anche scegliere di chiamare FreeLibrary per scaricarlo. (Sono andato avanti e ho cancellato la mia risposta originale. –

+0

@Steven: È vero, ho pensato che se avesse bisogno di usare LoadLibrary, gli avrei dato solo un punto di partenza, senza impantanarmi nei (molti) dettagli grintosi. – jalf

0

La prima cosa che devi fare è # include il file di intestazione che descrive le funzioni disponibili in quella libreria.

Il codice vero e proprio per la libreria sarà in uno dei 2 posti:

  1. Una libreria statica (lib)
  2. Una DLL (dll)

seconda di come il il codice di libreria è dato a voi (come .lib file, o come dLL), dovrete sia:

  • #pragma comment (lib, "libraryname.lib") se la sua una lib
  • LoadLibrary se una dll

A volte un pacchetto viene fornita sia con un file .lib che avete bisogno di collegare, e un file dll. In questo caso non è necessario chiamare LoadLibrary, è necessario solo #pragma comment (lib, "libaryfile.lib") perché in questo caso il .lib ti collega al file .dll.

Un dettaglio molto importante è mettere la DLL dove la tua applicazione può trovarla. Charles Petzold dice:

Quando Windows deve caricare un modulo DLL prima di eseguire un programma che lo richiede, il file della libreria deve essere memorizzato nella directory contenente il programma .EXE, la directory corrente, la directory di sistema di Windows, il Directory di Windows o una directory accessibile tramite la stringa PATH nell'ambiente MS-DOS. (Le directory vengono cercati in questo ordine.) Programming windows, 5th ed MSDN

mi consiglia di non utilizzare il menu di proprietà del progetto per creare un collegamento, perché non è così visibile ciò che le biblioteche si sta collegando.

See also

+0

Questo non risponde alla domanda. –

+0

Questo risponde alla domanda ora, ma non correttamente. Come sottolineato da jalf, normalmente si collega alla lib di importazione (usando il pragma o altrimenti aggiungendolo alla riga di comando con cui lib.exe termina). L'uso di LoadLibrary è l'alternativa tardiva. –

4

C++ non ha le biblioteche, nel senso che stai pensando di. Ha i file di intestazione che hai #include e ha cose chiamate librerie con cui il linker si occupa, che contengono il codice compilato. È necessario aggiungere le librerie (file .LIB) alle impostazioni del linker.

Su Windows se si sta utilizzando una DLL, idealmente si dovrebbe avere un file .LIB con cui si chiama la libreria di importazione per la DLL e si aggiunge il file .LIB alle impostazioni del linker.

9

Il concetto di base è il seguente: Esistono 2 tipi di librerie: statiche & dinamiche. La differenza tra loro è che le librerie statiche durante la fase di costruzione del link incorporano il loro codice compilato nel tuo eseguibile (o dll); le librerie dinamiche incorporano semplicemente i puntatori alle funzioni e un'istruzione che alcune DLL dovrebbero essere caricate quando il programma sta per essere caricato. Questo è realizzato per te dal linker.

Ora è possibile decidere quale di questi due si intende utilizzare. Le DLL hanno molti vantaggi e svantaggi. Se si sta sviluppando un'applicazione enorme, potrebbe valere la pena di prendere in considerazione l'utilizzo di DLL con il caricamento in ritardo anziché le librerie statiche. Alcune librerie vengono semplicemente consegnate come DLL e non hai scelta. Ad ogni modo il modo più semplice per un principiante sarebbe usare le librerie statiche. Ciò renderebbe molto più semplice la distribuzione e il test, poiché quando si ha a che fare con la DLL è necessario assicurarsi che vengano trovati in fase di esecuzione (anche quando si usa il debugger) ciò comporta la copia di tutto in una directory o la gestione delle variabili di percorso.

In genere un provider DLL (se si intende che si dovrebbe essere in grado di gestire la libreria) fornisce un file di intestazione e un file .lib che contiene le chiamate nella DLL desiderata. Alcuni fornitori (ad es. Boost) richiedono solo di includere il file di intestazione e la lib è automaticamente collegata al file eseguibile (può essere ottenuta tramite la direttiva prora- minario del compilatore del compilatore). In caso contrario, è necessario accedere alle impostazioni del progetto C++ (proprietà del progetto/Proprietà di configurazione/Linker/Input) e inserire il nome del file lib nella riga "Dipendenze aggiuntive", ad es. iced.lib iceutild.lib. Qui puoi anche inserire nomi di percorso completi. Tenere presente che è necessario immettere i nomi dei file lib per entrambe le configurazioni (Debug, Release). Questa è la procedura che esegui con le librerie statiche e Dll allo stesso modo. L'unica differenza che la DLL richiede una lib di DLL è nella directory dell'app o in una delle directory di percorso.

Dopo questo passaggio si potrebbero ancora ottenere errori del compilatore se si tenta di collegare librerie incompatibili. Ci sono molte ragioni, perché possono essere incompatibili. Ma prova a collegare prima la libreria in questo modo e guarda se funziona. In caso contrario, invia di nuovo i tuoi errori qui;)

Includi file (s) sono (sono) utilizzati per essere inclusi in luoghi, dove si desidera utilizzare smth. dalla lib. Basta includerlo e il compilatore saprà che i simboli devono provenire da un'altra unità compilata (compilata) (compilato cpp-file => file oggetto) o da .lib. Effettuerà la ricerca e notificherà se i simboli richiesti non vengono trovati.

Good Luck,
Ovanes

P.S. All'inizio potrebbe essere difficile, ma quando ci si abitua, sarà facile.

Problemi correlati