Question

Après avoir traversé un long processus pour renommer un projet, mon projet DLL ne construira pas en mode débogage (Release builds travail):

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

Ce projet, et les cinq bibliothèques statiques dont il dépend, sont mis à utiliser "Multi-thread de débogage (/ MTd)" (en C / C ++ | Génération de code | Runtime Library). Je crois que LIBCMTD.lib est celui pour le débogage multi-thread, mais ce qui est MSVCRTD.lib, et ce qui pourrait causer cette erreur?

Si cela fait une différence, cette DLL est pour Windows CE.

Était-ce utile?

La solution

LIBCMT est ce que vous avez besoin pour / MT, MSVCRT est ce que vous avez besoin pour / MD. Vous liez .obj et .lib qui ont été mélangés, certains compilé avec / MT certains avec / MD. Ce n'est pas bon.

En général, ce sont les fichiers .lib qui causent le problème. Passez en revue les paramètres de construction et assurez-vous de leur option / M est le même que votre projet DLL.

De plus, méfiez-vous de la peine que vous pouvez obtenir en si la DLL a été compilé avec / MT. Vous aurez des problèmes majeurs lorsque la DLL retourne des pointeurs vers des objets que le client a besoin de libérer. Il ne peut pas, il ne pas utiliser la même allocateur de mémoire.

Autres conseils

L'article MSDN sur LNK4098 a une très utile tableau: il vous indique quelles bibliothèques ajouter manuellement à la liste « Ignorer la bibliothèque spécifique », selon le CRT que vous utilisez. Dans votre cas, vous devez ignorer tous ces éléments:

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

Notez que la bibliothèque est signalé dans cette liste aussi. Le problème est décrit plus en détail dans KB154753 ... bibliothèques qu'un programme reliera avec une fois construit en utilisant Visual C ++

Mon interprétation est que, dans certains cas, l'algorithme qui sélectionne automatiquement les bibliothèques CRT pour lier votre code avec ramassera plusieurs bibliothèques contradictoires.

Qu'est-ce que la libération trop? Définition d'une DLL pour le débogage multithread peut causer des problèmes si vous allouez de la mémoire que quelque chose accesing la DLL essaie de libérer (ils seront attribués dans différents tas, par exemple). Essayez de configurer DLL de débogage multi-thread.

Votre problème de lien se pose probablement parce qu'une bibliothèque vous liez attend DLL de débogage multithread si l'éditeur de liens essaie de lier les deux et votre lien échoue ...

Le problème est le msvcr90d.dll est pas dans les fenêtres image CE. Il doit être déployé avec l'application. Le msvcr90d.dll est situé dans $ (VCInstallDir) / ce / bin / $ (ARCHFAM).

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top