Existem 4 versões das bibliotecas de links CRT presentes em vc \ lib:
- libcmt.lib: biblioteca estática de links CRT para uma compilação de versão (/ MT)
- libcmtd.lib: biblioteca estática de links CRT para uma compilação de depuração (/ MTd)
- msvcrt.lib: biblioteca de importação para a versão DLL do CRT (/ MD)
- msvcrtd.lib: biblioteca de importação para a versão DLL de depuração do CRT (/ MDd)
Observe as opções do vinculador, Projeto + Propriedades, Vinculador, Linha de comando. Observe como essas bibliotecas não são mencionadas aqui. O vinculador descobre automaticamente qual opção / M foi usada pelo compilador e qual .lib deve ser vinculado por meio de uma diretiva de comentário #pragma. Meio importante, você obteria erros de link horríveis e difíceis de diagnosticar erros de tempo de execução se houvesse uma incompatibilidade entre a opção / M e o .lib ao qual você vincula.
Você verá a mensagem de erro que você citou quando o vinculador for solicitado a vincular ao msvcrt.lib e libcmt.lib. O que acontecerá se você vincular o código que foi compilado com / MT com o código que foi vinculado com / MD. Pode haver apenas uma versão do CRT.
/ NODEFAULTLIB diz ao vinculador para ignorar a diretiva de comentário #pragma que foi gerada a partir do código compilado / MT. Isso pode funcionar, embora uma série de outros erros do vinculador não seja incomum. Coisas como errno , que é um int externo na versão estática do CRT, mas com macro para uma função na versão DLL. Muitos outros assim.
Bem, corrija esse problema da maneira certa, localize o arquivo .obj ou .lib que você está vinculando que foi compilado com a opção / M errada. Se você não tem idéia, poderá encontrá-lo preenchendo os arquivos .obj / .lib para "/ MT"
Btw: os executáveis do Windows (como version.dll) têm sua própria versão CRT para realizar seu trabalho. Ele está localizado em c: \ windows \ system32, você não pode usá-lo com segurança em seus próprios programas, seus cabeçalhos CRT não estão disponíveis em nenhum lugar. A DLL CRT usada pelo seu programa tem um nome diferente (como msvcrt90.dll).