2012-08-30 10 views
16

Il mio background è C# ma devo mantenere qualche C++ legacy (MS). In quel codebase mi sono imbattuto in:C++: cosa fa effettivamente il commento di #pragma (lib, "XXX") con "XXX"?

#pragma comment(lib, "OtherLib700.lib") 

dove 700 è un po 'di versione. Inoltre la lib è una DLL con lo stesso nome.

Inizialmente ho pensato che il programma dipendesse dalla DLL ma dopo averlo rimosso dal sistema il programma funziona ancora. Esiste tuttavia una versione più recente della DLL, che si chiama OtherLib900 ...

Sembra che il programma "includa" il codice della lib in modo che non dipenda più dalla DLL esterna. (O che il programma 'automaticamente' utilizza la DLL più recente ...)

Quale è corretto? C'è modo di confermare ulteriormente questa "ipotesi"?

+3

Downvoted per accettare la risposta sbagliata. – rustyx

risposta

3

Se un programma ha questo pragma cercherà la libreria OtherLib700.lib. Se quella è una libreria di importazione quando il programma è caricato, Windows cercherà OtherLib700.dll nel percorso. Non tenterà di cercare OtherLib900.dll durante l'esecuzione, quindi deve trovare il tuo dll in una cartella diversa. Ciò presuppone che OtherLib700.lib sia una libreria di importazione e non una libreria statica. Se OtherLib700 è una libreria statica, allora è tutto ciò di cui ha bisogno.

+0

Sì 700 normalmente sarà un po 'di versione, tuttavia Windows cercherà una corrispondenza esatta e non tenterà di caricare una libreria con versione più alta con lo stesso nome. – drescherjm

+0

Come faccio a sapere se l'altra lib è un'importazione o una libreria statica? Quindi, se è statico, il suo codice è incluso nel programma "mio"? – steglig

+1

Credo che la risposta di seguito descriva come distinguere: http://stackoverflow.com/questions/6402586/know-if-lib-is-static-or-import – drescherjm

33

Questo pragma viene utilizzato per il collegamento al file .lib specificato. Questa è un'alternativa alla specifica della libreria nel campo delle dipendenze esterne nelle impostazioni del progetto.

Per lo più, è utilizzato per supportare le versioni differenti:

#ifdef USE_FIRST_VERSION 
#pragma comment(lib, "vers1.lib") 
#else 
#pragma comment(lib, "vers2.lib") 
#endif 

Quando l'applicazione utilizza una libreria in modo dinamico-linked, un file lib ti dice le informazioni su ciò che i simboli vengono esportati nel dll. Quindi, in pratica, è necessario solo il lib per compilare il collegamento &, ma è necessario il dll per eseguire il programma, poiché contiene tutto il codice binario.

Si dice che è associato uno dll, che di solito indica che il file lib contiene solo informazioni di collegamento e nessun codice. Si dovrebbe ottenere un errore di run-time se il relativo dll non è stato trovato. È possibile verificare con MSVS se è stata caricata una versione diversa di dll o se è stata caricata da una posizione diversa.

+0

* "Hai solo bisogno della lib per compilare & link" * .. così la lib può essere un'alternativa a un file di intestazione (.h)? – Acidic

-2

Se il .lib è una lib "reale" con il codice effettivo (non ho mai usato le DLL salvate per quelle fornite dal sistema, ma credo che si facciano "librerie di importazione" per le proprie DLL), quindi il DLL non richiesta

Per quanto riguarda il soggetto, il commento #pragma (lib, xxx) consente ai programmi di aggiungere determinate opzioni per il linker. Può essere molto utile, anche se ho perso alcune opzioni che avrei voluto aggiungere in questo modo. L'esempio fornito è un primo esempio per il suo utilizzo: quando il file oggetto è incluso nel programma, verrà aggiunto anche il lib specificato.

+2

Cos'è una "vera" lib? –

+0

Penso che intendesse la libreria "statica". – moala

Problemi correlati