Domanda

Dopo aver attraversato un lungo processo per rinominare un progetto, il mio progetto DLL non costruire in modalità Debug (build di rilascio di lavoro):

MSVCRTD.lib(msvcr90d.dll) : error LNK2005: _CrtDbgReportW already defined in LIBCMTD.lib(dbgrpt.obj)

Questo progetto, e le cinque librerie statiche da cui dipende, sono impostati per utilizzare "Debug multi-threaded (/ MTd)" (in C / C ++ | Code Generation | Runtime Library). Credo LIBCMTD.lib è quello per il debug multi-threaded, ma ciò che è MSVCRTD.lib, e che cosa potrebbe causare questo errore?

Se si fa la differenza, questa DLL è per Windows CE.

È stato utile?

Soluzione

LIBCMT è quello che serve per il / MT, MSVCRT è quello che serve per il / MD. Si sta collegando i file .lib che sono stati mescolati obj e, un po 'compilato con / MT alcune con / MD. Questo non va bene.

Di solito è il file .lib che causano il problema. Rivedere le loro impostazioni di generazione e assicurarsi che la loro opzione / M è lo stesso del vostro progetto DLL.

Inoltre, fate attenzione al problema si può entrare in se la DLL è stata compilata con / MT. Avrete grossi problemi quando la DLL restituisce puntatori a oggetti che il client deve rilasciare. Non può, non utilizzare lo stesso allocatore di memoria.

Altri suggerimenti

L'articolo MSDN su LNK4098 ha un tavolo molto utile: ti dice quali librerie per aggiungere manualmente alla lista "Ignora libreria specifica", a seconda di quale CRT che si sta utilizzando. Nel tuo caso, si dovrebbe ignorare tutti questi:

libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib

Si noti che la libreria riportato è in questo elenco anche. Il problema è descritto in dettaglio nel KB154753 ... librerie che un programma verrà collegato con quando costruito utilizzando Visual C ++

La mia interpretazione di questo è che in certe situazioni l'algoritmo che sceglie automaticamente quale librerie CRT per collegare il codice con la volontà di raccogliere diverse librerie contrastanti.

Cosa si stampa troppo? L'impostazione di una DLL per eseguire il debug multithread può causare problemi se si alloca la memoria che qualcosa accesing la DLL tenta di liberare (che saranno assegnati in diversi cumuli, per esempio). Prova a impostare multi-threaded DLL di debug.

Il tuo problema di collegamento, probabilmente deriva dal fatto che una biblioteca stai facendo riferimento si aspetta multithread DLL di debug in modo che il linker cerca di collegare entrambi e il vostro link non ...

Il problema è il msvcr90d.dll non è l'immagine di Windows CE in. Si deve essere distribuito con l'applicazione. Il msvcr90d.dll si trova in $ (VCInstallDir) / CE / bin / $ (ARCHFAM).

http://stackoverflow.com/questions/15959877/windows-ce-6-0-and-runtime-link-to-debug-dll-mdd

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top