2011-12-22 16 views
11

Ho una domanda generale su come si supponga di utilizzare .dll/.libs. Sto creando un file .dll da utilizzare per il mio progetto, tuttavia, ho notato che quando vado a compilare ho bisogno di collegare staticamente il .lib associato al file .dll per la compilazione del progetto (altrimenti c'è l'errore di collegamento "fatale" errore LNK1107: file non valido o danneggiato: impossibile leggere su 0x300 "). Quindi più tardi, quando andrò a redistrobute il mio progetto, poi lo aggiornerò in futuro, avrò bisogno di spedire un nuovo .exe e una nuova .dll piuttosto che solo una nuova .dll? Se questo è il caso, allora perché preoccuparsi di usare .dll?Lib e DLL che collegano a un errore exe "non è possibile leggere a 0x300"

risposta

29

Il .lib contiene stub per le funzioni ecc. Che vengono esportati dalla DLL. Colleghi il .lib nel tuo EXE e ora il tuo EXE sa come chiamare le funzioni. Ma ovviamente non c'è alcuna funzione lì - le chiamate non vanno da nessuna parte. Al momento del caricamento, quando il sistema operativo carica il file EXE, carica anche la DLL e quindi applica l'EXE - dove l'EXE chiama nello stub, il caricatore lo sostituisce con una chiamata nella funzione reale nella DLL.

Normalmente non è necessario spedire il .lib ai propri clienti. Tuttavia, se i tuoi clienti desiderano scrivere i propri EXE che usano la tua DLL, dovrai inviare loro il .lib in modo che possano collegare il loro EXE a esso.

Errore linker LNK1107 significa che si è tentato il collegamento alla DLL anziché a .lib. È sempre sbagliato, perché per definizione una DLL è collegata dinamicamente al runtime, piuttosto che staticamente al momento della compilazione.

+0

Sto provando quello che mi hai suggerito. Il mio problema è che quando sto costruendo in modalità di debug non viene generato alcun file lib. Viene generato solo il file dll. come posso generare il file lib nella versione di debug. –

+0

Il tuo commento sembra suggerire di ottenere un file lib nella build di rilascio, ma non nella build di debug. È giusto? In tal caso, assicurati di aver impostato le stesse opzioni linker in entrambi i build (tranne, ovviamente, per quelli che devono essere diversi tra release ed debug.) –

+0

Generalmente il linker genera automaticamente la libreria di importazione se la tua DLL contiene funziona con l'attributo __declspec (dllexport) o se si esportano le funzioni esplicitamente con un file DEF. Forse il tuo __declspec (dllexport) è escluso dal compilatore perché è circondato da #ifndef (_DEBUG) o qualcosa del genere? –

Problemi correlati