2010-12-02 2 views
5

J'ai un projet dll dans lequel, lorsque dans la configuration de sortie Je construis le projet, je reçois l'avertissement suivant:visual studio LNK4098 d'avertissement de linker

MSVCRT.lib (cinitexe.obj): avertissement LNK4098: defaultlib 'msvcrtd.lib' conflits avec l'utilisation d'autres bibliothèques; utiliser /NODEFAULTLIB: bibliothèque

Il est juste un avertissement, mais je ne sais pas si cela devrait être pris en compte. Pour ce que j'ai découvert, ils sont à la fois libs multithread, versions normales et de débogage. Mon dll utilise multithreading et je peux le déboguer, bien que je l'utilise boost: fil pour ça, donc je sais pas vraiment si je besoin de cette bibliothèque Windows spécifiques pour le débogage ou la construction Release ...

Meilleures salutations, Alex

Eh bien, je l'ai fait comme suggéré BuschnicK et en utilisant le/VERBOSE: flag l'éditeur de liens LIB Je trouve que je à ces bibliothèques liant dans la configuration de débogage:

boost_filesystem-VC100-mt-GD-1_44.lib: libboost_system- vc100-mt-gd-1_44.lib: libboost_thread-vc100-mt-gd-1_44.lib: libboost_date_time-vc100-mt-gd-1_44.lib:

J'ai eu le même dans Release config, principalement parce que je n'ai pas spécifié alors "explicitement". Ainsi, je les ai changé à cela en sortie:

boost_filesystem-VC100-mt-1_44.lib: libboost_system-VC100-mt-1_44.lib: libboost_thread-VC100-mt-1_44.lib: libboost_date_time-VC100 -mt-1_44.lib:

Cela semble fonctionner mais je recevais toujours le premier avertissement, jusqu'à ce que je me rende compte que j'avais la définition du préprocesseur _DEBUG dans ma version Release, je l'ai enlevé et ça marche bien maintenant.

Merci à tous pour votre aide !!

Répondre

7

Il semble que vous puissiez exécuter une bibliothèque de débogage et une bibliothèque compilée de versions dans la même version.Parcourez les options de votre projet et choisissez d'utiliser les versions de débogage de toutes les bibliothèques tierces que vous utilisez.

+0

La seule bibliothèque de boost que j'utilise qui nécessite lib linking est le système de fichiers, qui, hsa deux versions: – AlejandroVK

+0

Oubliez le dernier commentaire: La seule bibliothèque de boost que j'utilise qui nécessite lib linking est le système de fichiers, qui, deux versions: boost_filesystem-vc100-mt-gd-1_44.lib, boost_filesystem-vc100-mt-1_44.lib. Je suppose que le premier est pour le débogage multithread, et deuxième juste mt. Je n'ai jamais spécifié dans mes options d'éditeur de liens lequel choisir, il le fait "automatiquement" ... pourrait-il être la source des problèmes? – AlejandroVK

10

Il dit que le problème est juste dans le message si vous lisez attentivement: « MSVCRT.lib » vs « MSVCRTD.LIB »

avis l'ajout « d » dans le deuxième nom de la bibliothèque. Ce qui se passe, c'est que vous établissez une liaison statique avec le studio visuel C++ runtime (MSVCRT). L'une de vos bibliothèques tire la version de cette lib alors qu'une autre tire la version de débogage (d'où le suffixe "d"). L'éditeur de liens vous indique que les deux bibliothèques définissent des fonctions avec le même nom, sont en conflit et que l'une d'entre elles est automatiquement supprimée. Pour résoudre ce problème, passez en revue les paramètres de construction de tous vos projets/bibliothèques et assurez-vous qu'ils utilisent les mêmes bibliothèques d'exécution pour toutes les configurations de construction. Regardez project properties ->C/C++ ->Code Generation -> . Cela devrait probablement lire "multithread" pour les versions de version et "debug multithread" pour les versions de débogage.

Notez qu'il est généralement considéré comme une mauvaise pratique de lier ces bibliothèques de manière statique et que vous préfériez les versions dll dynamiquement liées.

+0

MSVCRT est déjà la version dynamique. Vous devez toujours créer un lien vers celui-ci, bien que ce soit via une bibliothèque d'exportation. http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.100).aspx –

+0

Désolé ma mauvaise. Tu as raison, bien sûr. Le reste de la réponse devrait toujours être correct. – BuschnicK

+0

Hmmmmm, j'ai vérifié les deux configurations, dans Debgug -> DLL de débogage multi-thread (/ MDd) et dans Release -> Multi-threaded DLL (/ MD), et je reçois toujours l'avertissement, dois-je utiliser/NODEFAULTLIB: MSVCRTD.LIB pour la configuration de version? – AlejandroVK