2009-02-24 18 views
55

Voglio un singolo progetto di Visual Studio che costruisca un file DLL e un file di libreria di importazione (.lib). (Una libreria di importazione è una libreria collegata staticamente che si occupa di caricare il file DLL in altri progetti che lo utilizzano).Come si costruisce una libreria di importazione (.lib) E una DLL in Visual C++?

Così sono andato a Visual Studio C++ 2008 Express Edition, ho creato un nuovo progetto di tipo Libreria di classi e ho impostato "Tipo di configurazione" come "Libreria Dyanamic (.dll)".

Ma quando si crea la soluzione, l'unico file di output rilevante che vedo è un file DLL; Non vedo generato alcun file LIB. Ho guardato nella directory del progetto e in tutte le sottodirectory (Release e Debug).

Credo che sia possibile creare un file LIB e DLL allo stesso tempo perché on the MSDN it says "The linker creates the import library when the DLL is built." Inoltre, another user of this website is creating LIB and DLL files at the same time using Visual C++.

Quindi, come posso farlo?

+1

Ho appena avuto questo esatto problema in cui il mio file .lib non veniva generato. Dopo aver cercato su google tutte le informazioni che ho trovato sulle possibili cause e esaminando attentamente tutte le risposte di seguito ho finalmente capito che era perché il mio file .cpp non includeva il mio file .h. :(Basta lanciarlo qui in modo che il mio commento possa (con una piccola probabilità) aiutare qualcuno/me stesso se il mio stupido errore si ripete in qualche lontano futuro ... – user1884905

risposta

19

Selezionando "Libreria di classi" è stato accidentalmente detto di creare una libreria .Net utilizzando l'estensione CLI (gestita) di C++.

Invece, creare un progetto Win32 e in Impostazioni applicazione nella pagina successiva, selezionare "DLL".

È anche possibile creare una DLL o DLL ATL MFC da quelle scelte di libreria se si desidera seguire tale percorso, ma sembra che non lo si faccia.

68

Il progetto DLL presenta esportazioni effettive? Se non ci sono esportazioni, il linker non genererà un file .lib di libreria di importazione.

Nella versione non espresso di VS, il nome di importazione libray è specfied nelle impostazioni del progetto qui:

Configuration Properties/Linker/Advanced/Import Library 

Penso che sia lo stesso in veloce (se fornisce anche la possibilità di configurare il nome).

+6

Grazie Michael, nel mio caso la lib non è stata generata perché non c'erano esportazioni. – Uday

+4

OK, quindi cosa significa? Ho specificato la libreria di importazione sul mio progetto DLL e ancora non ha creato la DLL. L'ho inserito nel progetto che utilizza la mia DLL e non ne ha causato la creazione. Sto usando Visual C++ 2010 Express – Thom

+1

Potresti chiarire un po 'su questo? Specificare da solo la libreria di importazione non sembra generare il file .lib. –

8

anche necessario specificare def nome nelle impostazioni del progetto qui:

Configurazione> Proprietà/Input/Avanzate/Modulo> file di definizione

+4

Situato in 'Proprietà di configurazione' /' Linker' /' Input'/'File di definizione modulo' in VS2010 – Pakman

+0

Come si crea il file di definizione? Cosa c'entra? –

+0

Grazie ... questo mi stava facendo impazzire. –

23

OK, così ho trovato la risposta da http://binglongx.wordpress.com/2009/01/26/visual-c-does-not-generate-lib-file-for-a-dll-project/ dice che questo problema era causato dall'esportazione di alcun simbolo e ulteriori istruzioni su come esportare i simboli per creare il file lib. Per fare ciò, aggiungere il seguente codice al file .h per la DLL.

#ifdef BARNABY_EXPORTS 
#define BARNABY_API __declspec(dllexport) 
#else 
#define BARNABY_API __declspec(dllimport) 
#endif 

Dove BARNABY_EXPORTS e BARNABY_API sono definizioni univoche per il progetto. Poi, ogni funzione che si esporta semplicemente preceduto da:

BARNABY_API int add(){ 
} 

Questo problema avrebbe potuto essere evitata o facendo clic sulla casella Esporta simboli sul nuovo progetto DLL Wizard o votando sì per lobotomia per programmatori di computer.

+0

Puoi modificare questo in modo che non sia una copia esatta della tua altra risposta? Farlo applicare a questa domanda è un buon punto di partenza. Grazie. – Will

+0

Risolto, Will. Ho postato per sbaglio quella risposta a questa pagina. Ora ho ripulito il mio casino. Grazie per avermi seguito. – Thom

+4

+1 per "lobotomie per programmatori di computer". –