Il existe 4 versions des bibliothèques de liens CRT présentes dans vc \ lib:
- libcmt.lib: bibliothèque de liens CRT statiques pour une version (/ MT)
- libcmtd.lib: bibliothèque de liens CRT statiques pour une version de débogage (/ MTd)
- msvcrt.lib: bibliothèque d'importation pour la version DLL de sortie du CRT (/ MD)
- msvcrtd.lib: bibliothèque d'importation pour la version DLL de débogage du CRT (/ MDd)
Regardez les options de l'éditeur de liens, Projet + Propriétés, Éditeur de liens, Ligne de commande. Notez que ces bibliothèques ne sont pas mentionnées ici. L'éditeur de liens détermine automatiquement quel commutateur / M a été utilisé par le compilateur et quel .lib doit être lié via une directive de commentaire #pragma. Un peu important, vous obtiendriez des erreurs de lien horribles et des erreurs d'exécution difficiles à diagnostiquer s'il y avait un décalage entre l'option / M et le .lib avec lequel vous vous connectez.
Vous verrez le message d'erreur que vous avez cité lorsque l'éditeur de liens est invité à se lier à msvcrt.lib et libcmt.lib. Cela se produira si vous liez du code qui a été compilé avec / MT avec du code qui a été lié avec / MD. Il ne peut y avoir qu'une seule version du CRT.
/ NODEFAULTLIB indique à l'éditeur de liens d'ignorer la directive de commentaire #pragma qui a été générée à partir du code compilé / MT. Cela pourrait fonctionner, bien qu'une multitude d'autres erreurs de l'éditeur de liens ne soient pas rares. Des choses comme errno , qui est un int externe dans la version statique CRT mais macro-ed à une fonction dans la version DLL. Beaucoup d'autres aiment ça.
Eh bien, corrigez ce problème de la bonne manière, recherchez le fichier .obj ou .lib que vous liez qui a été compilé avec la mauvaise option / M. Si vous n'avez aucune idée, vous pouvez le trouver en saisissant les fichiers .obj / .lib pour "/ MT"
Btw: les exécutables Windows (comme version.dll) ont leur propre version CRT pour faire leur travail. Il est situé dans c: \ windows \ system32, vous ne pouvez pas l'utiliser de manière fiable pour vos propres programmes, ses en-têtes CRT ne sont disponibles nulle part. La DLL CRT utilisée par votre programme porte un nom différent (comme msvcrt90.dll).