2013-02-26 15 views
7

Ho un file foo.h che ha varie dichiarazioni per le funzioni. Tutte queste funzioni sono implementate in un file foo.dll. Tuttavia, quando ho includere il file .he tenta di utilizzare una qualsiasi delle funzioni, ottengo l'errore:Come si collega una DLL al mio progetto? errore LNK2019: simbolo esterno non risolto

bar.obj : error LNK2019: unresolved external symbol SomeFunction 

quindi ovviamente le implementazioni di funzione non vengono trovati.

Cosa devo fare per aiutare il compilatore a trovare le definizioni nella DLL e associarle al file .h?

Ho visto alcune cose su __declspec(dllexport) e __declspec(dllimport) ma non riesco ancora a capire come usarle.

+0

Stai collegando il tuo eseguibile con la libreria di importazione di 'foo.dll' (di solito chiamato' foo.lib')? –

+0

Sono nuovo di così, quindi non sono sicuro di come sia fatto. È nelle proprietà dello studio visivo per il progetto? – xcdemon05

+1

@ xcdemon05, sì, tra le opzioni del linker lì. –

risposta

8

Dovreste aver ricevuto almeno tre file da parte del proprietario DLL. La DLL di cui avrai bisogno in runtime, il file .h con le dichiarazioni delle funzioni esportate, hai già questo. E un file .lib, la libreria di importazione per la DLL. Quale richiede il linker in modo che sappia come aggiungere le funzioni alla tabella di importazione del programma.

Ti manca il passaggio in cui hai detto al linker di aver bisogno di collegare il file .lib. Deve essere aggiunto all'impostazione Input + Additional Dependencies del linker del progetto. O più facilmente fatto scrivendo le istruzioni linker nel codice sorgente:

#include "foo.h" 
#pragma comment(lib, "foo.lib") 

che lavora per MSVC, non altrimenti portatile, ma il collegamento non è. Copia il file .lib nella directory del progetto o specifica il percorso completo.

+0

C'è una differenza tra l'uso di '#pragma comment' e l'aggiunta del file lib a' Proprietà progetto> Linker> Input'? – Nitay

+1

Non c'è differenza, semplicemente non puoi dimenticare di cambiare quell'impostazione. –

3
  1. è necessario specificare di fronte a definizioni di funzioni __declspec (dllexport), al momento della costruzione del dll
  2. è necessario importare o caricare il file dll nella memoria del processo.
  3. È necessario acquisire l'indirizzo della funzione che si desidera utilizzare da tale DLL.

Alcuni link utili per iniziare :: MSDN Documentation, SO, Random

6

Ho appena avuto un problema simile. La soluzione risultò essere che la DLL era a 64 bit, e la semplice app che usava era 32. Avevo dimenticato di cambiarlo in x64 in Configuration Manager.

+2

Hai appena salvato la mia giornata dopo tre ore di ricerca su Internet. – Dan

Problemi correlati