W vc \ lib są 4 wersje bibliotek linków CRT:
- libcmt.lib: statyczna biblioteka linków CRT dla kompilacji wydania (/ MT)
- libcmtd.lib: statyczna biblioteka linków CRT do kompilacji debugowania (/ MTd)
- msvcrt.lib: importuj bibliotekę dla wersji DLL CRT (/ MD) wersji DLL
- msvcrtd.lib: importuj bibliotekę dla debugowej wersji CRT DLL (/ MDd)
Spójrz na opcje linkera, Projekt + Właściwości, Linker, Wiersz poleceń. Zwróć uwagę, że te biblioteki nie są tutaj wymienione. Linker automatycznie rozpoznaje, który przełącznik / M został użyty przez kompilator, a który .lib powinien zostać połączony poprzez dyrektywę komentarza #pragma. Co ważne, dostaniesz straszne błędy łącza i trudne do zdiagnozowania błędy w czasie wykonywania, jeśli wystąpi rozbieżność między opcją / M a .lib, z którym łączysz się.
Zobaczysz komunikat o błędzie, który zacytowałeś, gdy linker otrzyma polecenie połączenia z msvcrt.lib i libcmt.lib. Co się stanie, jeśli połączysz kod skompilowany z / MT z kodem, który został połączony z / MD. Może istnieć tylko jedna wersja CRT.
/ NODEFAULTLIB mówi linkerowi, aby zignorował dyrektywę komentarza #pragma, która została wygenerowana z kodu skompilowanego / MT. Może to działać, chociaż mnóstwo innych błędów linkera nie jest rzadkością. Rzeczy takie jak errno , który jest zewnętrznym intem w statycznej wersji CRT, ale makropoleceniem funkcji w wersji DLL. Wielu innych to lubi.
Cóż, napraw ten problem we właściwy sposób, znajdź plik .obj lub .lib, który łączysz, który został skompilowany z niewłaściwą opcją / M. Jeśli nie masz pojęcia, możesz go znaleźć, przechodząc do plików .obj / .lib dla „/ MT”
Btw: pliki wykonywalne systemu Windows (takie jak version.dll) mają własną wersję CRT, aby wykonać zadanie. Znajduje się w folderze c: \ windows \ system32, nie można niezawodnie używać go do własnych programów, jego nagłówki CRT nie są nigdzie dostępne. Biblioteka CRT DLL używana przez program ma inną nazwę (np. Msvcrt90.dll).