Esistono 4 versioni delle librerie di collegamento CRT presenti in vc \ lib:
- libcmt.lib: libreria di link CRT statica per una build di rilascio (/ MT)
- libcmtd.lib: libreria di link CRT statica per una build di debug (/ MTd)
- msvcrt.lib: libreria di importazione per la versione DLL di rilascio del CRT (/ MD)
- msvcrtd.lib: libreria di importazione per la versione DLL di debug di CRT (/ MDd)
Guarda le opzioni del linker, Progetto + Proprietà, Linker, Riga di comando. Nota come queste librerie non sono menzionate qui. Il linker individua automaticamente quale opzione / M è stata utilizzata dal compilatore e quale .lib deve essere collegato tramite una direttiva di commento #pragma. Molto importante, otterrai errori di collegamento orribili e errori di runtime difficili da diagnosticare se ci fosse una discrepanza tra l'opzione / M e il .lib con cui ti colleghi.
Vedrai il messaggio di errore che hai citato quando al linker viene detto sia di collegarsi a msvcrt.lib che a libcmt.lib. Ciò accadrà se si collega il codice compilato con / MT con il codice collegato con / MD. Può esistere una sola versione del CRT.
/ NODEFAULTLIB dice al linker di ignorare la direttiva di commento #pragma generata dal codice compilato / MT. Ciò potrebbe funzionare, sebbene una serie di altri errori del linker non sia rara. Cose come errno , che è un int esterno nella versione CRT statica ma con macro-ed a una funzione nella versione DLL. A molti altri piace questo.
Bene, risolvi questo problema nel modo giusto, trova il file .obj o .lib che stai collegando che è stato compilato con l'opzione / M errata. Se non si ha idea, è possibile trovarlo greppando i file .obj / .lib per "/ MT"
A proposito: gli eseguibili di Windows (come version.dll) hanno la loro versione CRT per svolgere il loro lavoro. Si trova in c: \ windows \ system32, non puoi usarlo in modo affidabile per i tuoi programmi, le sue intestazioni CRT non sono disponibili da nessuna parte. La DLL CRT utilizzata dal programma ha un nome diverso (come msvcrt90.dll).