2010-03-31 7 views
3

Je construis un projet dans Visual C++ 2008, qui est un exemple d'application MFC pour une bibliothèque de classes C++ statique que j'utiliserai bientôt dans mon propre projet. Lors de la construction de la configuration de débogage, je reçois ce qui suit:Pourquoi la bibliothèque MSCVRT génère-t-elle des conflits au moment de la liaison?

avertissement LNK4098: defaultlib 'MSVCRT' est en conflit avec l'utilisation d'autres bibliothèques; utilisation/NODEFAULTLIB: bibliothèque

Après avoir utilisé l'option recommandée (en ajoutant « msvcrt » au champ « Ignorer la bibliothèque spécifique » dans les paramètres de l'éditeur de liens de projet pour la configuration de débogage), les liens du programme et fonctionne très bien. Cependant, j'aimerais savoir pourquoi ce conflit s'est produit, pourquoi dois-je ignorer une bibliothèque critique, et si je dois m'attendre à des problèmes plus tard, si j'ajoute l'ignorer, ou ce qui arrive si je ne le fais pas (parce que le programme construit quand même).

En même temps, la configuration de sortie met en garde contre:

avertissement LNK4075: ignorant '/ EDITANDCONTINUE' en raison de '/ OPT: ICF' spécification
avertissement LNK4098: defaultlib conflits 'MSVCRTD' avec l'utilisation de autres bibliothèques utilisation/NODEFAULTLIB: bibliothèque

Je devine que le suffixe « D » signifie que c'est la version de débogage de VC++ runtime, aucune idée pourquoi ceci se sert cette fois-ci. Quoi qu'il en soit, en ajoutant « msvcrtd » à l'ignorer champ provoque beaucoup d'erreurs de liaison de la forme:

erreur LNK2001: symbole externe non résolu __imp___CrtDbgReportW

Toute idée très appréciée.

Répondre

3

Cela se produit généralement lorsque vous effectuez un lien avec une bibliothèque statique qui utilise une autre version de l'environnement d'exécution VC++ (paramètre C++ ->Code Generation->Runtime Library dans les propriétés du projet).

+0

J'ai sélectionné/MDd dans les deux configurations et les avertissements ont disparu, supposons que la bibliothèque a été construite avec la version de débogage de la RT. Je me demandais toujours pourquoi MSVCRT était la valeur par défaut pour la construction Debug, et MSVCRTD pour la version. Semble-moi la valeur par défaut devrait être MSVCRTD pour les deux? – neuviemeporte

+1

Peut-être que c'est une faute des développeurs de la bibliothèque. Le débogage ne devrait être utilisé que pour les versions de débogage - il est nettement plus lent. – sharptooth

+0

Également eu ce problème, Merci qui a aidé. –

0

Cela m'est généralement arrivé lorsque j'étais (par mégarde) mélanger différentes saveurs de la RTL, comme (comme il semble être dans votre cas) Debug and Release ou MT et ST.

+0

Les deux configurations utilisent la variante "DLL multithread (/ MD)" du runtime. Ou voulez-vous dire quelque chose d'autre? – neuviemeporte

+0

@neuviemeporte: Voir la réponse de sharptooth pour savoir comment cela pourrait encore arriver. – sbi

Questions connexes