<p>Il existe 4 versions des bibliothèques de liaison CRT présentes dans vc\lib :</p>
<ul>
<li>
<p>libcmt.lib : bibliothèque de liaison CRT statique pour une compilation en release (/MT)</p>
</li>
<li>
<p>libcmtd.lib : bibliothèque de liaison CRT statique pour une compilation en debug (/MTd)</p>
</li>
<li>
<p>msvcrt.lib : bibliothèque d’importation pour la version DLL du CRT en release (/MD)</p>
</li>
<li>
<p>msvcrtd.lib : bibliothèque d’importation pour la version DLL du CRT en debug (/MDd)</p>
</li>
</ul>
<p>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 <span class="hashtag-raw">#pragma</span> 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.</p>
<p>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 <em>et</em> 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.</p>
<p>/NODEFAULTLIB indique à l’éditeur de liens d’ignorer la directive <span class="hashtag-raw">#pragma</span> 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 <em>errno</em>, 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.</p>
<p>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.</p>
<p>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).</p>