Résoudre LNK4098 : defaultlib 'MSVCRT' entre en conflit avec

Résoudre LNK4098 : defaultlib ‘MSVCRT’ entre en conflit avec

Il existe 4 versions des bibliothèques de liaison CRT présentes dans vc\lib :

  • libcmt.lib : bibliothèque de liaison CRT statique pour une compilation en release (/MT)

  • libcmtd.lib : bibliothèque de liaison CRT statique pour une compilation en debug (/MTd)

  • msvcrt.lib : bibliothèque d’importation pour la version DLL du CRT en release (/MD)

  • msvcrtd.lib : bibliothèque d’importation pour la version DLL du CRT en debug (/MDd)

Regardez les options de l’éditeur de liens, Project + Properties, Linker, Command Line. Remarquez que ces bibliothèques n’y sont pas mentionnées. 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 #pragma comment. C’est assez important, vous obtiendriez des erreurs de liaison horribles et des erreurs d’exécution difficiles à diagnostiquer s’il y avait une incompatibilité entre l’option /M et le .lib avec lequel vous effectuez la liaison.

Vous verrez le message d’erreur que vous avez cité lorsque l’éditeur de liens reçoit l’instruction de lier à la fois msvcrt.lib et libcmt.lib. Ce qui se produit si vous liez du code compilé avec /MT avec du code compilé avec /MD. Ce n’est pas valide, il ne peut y avoir qu’une seule version du CRT.

/NODEFAULTLIB indique à l’éditeur de liens d’ignorer la directive #pragma comment générée par le code compilé avec /MT. Cela peut fonctionner, bien qu’une série d’autres erreurs de liaison ne soit pas rare. Des choses comme errno, qui est un extern int dans la version CRT statique mais transformé en macro vers une fonction dans la version DLL. Et beaucoup d’autres similaires.

Eh bien, corrigez 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’en avez aucune idée, vous pouvez le trouver en cherchant “/MT” dans les fichiers .obj/.lib avec grep.

Au passage : les exécutables Windows (comme version.dll) ont leur propre version du CRT pour accomplir leur travail. Elle se trouve 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).