2013-11-26 17 views
11

Ho una domanda sul collegamento biblioteca e file lib ...Perché alcuni file DLL richiedono un file .lib aggiuntivo per il collegamento?

Questo è il contesto:

  • OS = di Windows
  • IDE = QT

Ho creato un DLL: MyLib.dll.
Per utilizzare tale libreria nel mio progetto QT, ho solo per includere un percorso di inclusione, un link alla biblioteca e utilizzare i file di intestazione:

LIBS += "C:\myPath\MyLib.dll" 
INCLUDEPATH += "C:\myPath" 
HEADERS += \ 
    ../myPath/MyLib_global.h \ 
    ../myPath/mylib.h 

Sto usando una terza dll parte nel mio progetto: terzo .dll
Se faccio lo stesso come nell'esempio di cui sopra, non funziona:

LIBS += "C:\myPath\third.dll" 

la terza parte DLL viene fornito con un file lIB "third.lib", che a quanto pare ho bisogno di usare insieme con la DLL.

Perché è quello? Perché alcune librerie DLL hanno bisogno di un file .lib ma altre librerie DLL no?
Potrebbe essere che il .lib sia una libreria statica che accede alla DLL?

Grazie mille!

risposta

4

Il file lib è un file di libreria di importazione, che consente al file eseguibile finale di contenere una tabella di indirizzi di importazione (IAT) con cui vengono riferite tutte le chiamate di funzioni DLL. Fondamentalmente, consentire la ricerca delle funzioni.

Si può leggere su di esso here.

Per avere Qt generare il lib, aggiungere questo al .pro: -

CONFIG+= staticlib 

Here's po 'di documentazione su come creare librerie.

+0

grazie @ Merlin069 per la risposta. questo lo chiarisce! Una cosa: quando ho creato myLib.dll, non ho visto alcun modo per generare un file lib con il file DLL. è un'opzione quando si crea la DLL? Inoltre, tutte le chiamate di funzione nella mia DLL sembrano essere accessibili anche senza il file lib. Non è ciò che il file .lib dovrebbe consentire? grazie – WewillSee

+0

Ci dovrebbe essere una libreria di importazione per impostazione predefinita. – ExpatEgghead

+0

È probabile che ci sia un'impostazione nell'IDE per creare il file lib, se non lo sta già generando. Per quanto ho capito, senza il file lib, è possibile caricare la DLL separatamente e chiamare le funzioni, ma la lib è richiesta se si vuole costruire un eseguibile con librerie statiche. – TheDarkKnight

3

La mia risposta potrebbe non essere specifica per il contesto, ma sarebbe utile alla maggior parte degli sviluppatori che fanno la stessa domanda. Questo è stato risposto da Anthony Williams

What is inside .lib file of Static library, Statically linked dynamic library and dynamically linked dynamic library?

Non avete bisogno di un file lib di utilizzare una libreria dinamica, ma senza uno non è possibile trattare le funzioni dalla DLL come funzioni normali nel codice . Invece è necessario chiamare manualmente LoadLibrary per caricare la DLL (e FreeLibrary al termine) e GetProcAddress per ottenere l'indirizzo della funzione o dell'elemento di dati nella DLL. È quindi necessario trasmettere l'indirizzo restituito a un puntatore-a-funzione appropriato per utilizzare .