Il y a 4 versions des bibliothèques de liens CRT présentes dans vc \lib :
- libcmt.lib : bibliothèque statique de liens CRT pour une compilation (/MT)
- libcmtd.lib : bibliothèque statique de liens CRT pour une compilation de débogage (/MTd)
- msvcrt.lib : bibliothèque d'importation pour la version DLL de la version release du CRT (/MD)
- msvcrtd.lib : bibliothèque d'importation pour la version DLL de débogage du CRT (/MDd)
Regardez les options du linker, Project + Properties, Linker, Command Line. 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é grâce à une directive de commentaire #pragma. C'est important, car vous obtiendriez d'horribles erreurs de liaison et des erreurs d'exécution difficiles à diagnostiquer s'il y avait un décalage entre l'option /M et la .lib que vous liez.
Vous verrez le message d'erreur que vous avez cité lorsqu'on demande à l'éditeur de liens de lier à msvcrt.lib. y libcmt.lib. Ce qui 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 peut fonctionner, mais il n'est pas rare qu'une foule d'autres erreurs d'édition de liens se produisent. Des choses comme errno qui est un extern int dans la version statique CRT mais qui est macro-edié à une fonction dans la version DLL. Beaucoup d'autres comme ça.
Pour résoudre ce problème de la bonne manière, trouvez le fichier .obj ou .lib que vous liez et qui a été compilé avec la mauvaise option /M. Si vous n'avez aucun indice, vous pouvez le trouver en recherchant "/MT" dans les fichiers .obj/.lib.
Btw : les exécutables Windows (comme version.dll) ont leur propre version CRT pour faire leur travail. Elle est située 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 a un nom différent (comme msvcrt90.dll).