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).
/verbose:lib
do dodatkowych opcji linkera. Pokazuje kolejność ładowania plików .lib, dzięki czemu możesz zobaczyć, gdzie zostałOznacza to, że jedna z zależnych bibliotek DLL jest skompilowana z inną biblioteką wykonawczą .
Projekt -> Właściwości -> C / C ++ -> Generowanie kodu -> Biblioteka wykonawcza
Przejrzyj wszystkie biblioteki i sprawdź, czy są one skompilowane w ten sam sposób.
Więcej informacji o tym błędzie w tym linku:
ostrzeżenie LNK4098: defaultlib „LIBCD” powoduje konflikty z użyciem innych bibliotek
źródło
IMO ten link od Yochai Timmer był bardzo dobry i odpowiedni, ale bolesny do przeczytania. Napisałem streszczenie.
Yochai, jeśli to przeczytasz, zobacz notatkę na końcu.
W pierwotnym poście przeczytano: ostrzeżenie LNK4098: defaultlib „LIBCD” powoduje konflikt z użyciem innych bibliotek
Błąd
Znaczenie
Jak rozwiązać
W tym ostatnim, jak wspomniano w oryginalnym poście, mogą pojawić się dwa typowe problemy:
W takich przypadkach upewnij się, że rozumiesz problem i wybierasz rozwiązania.
Uwaga: Chciałem dołączyć to podsumowanie linku Yochai Timmer do własnej odpowiedzi, ale ponieważ niektórzy ludzie mają problem z poprawnym sprawdzeniem poprawek, musiałem napisać je w osobnej odpowiedzi. Przepraszam
źródło
Otrzymuję to za każdym razem, gdy chcę utworzyć aplikację w VC ++.
Kliknij projekt prawym przyciskiem myszy, wybierz Właściwości, a następnie w obszarze „Właściwości konfiguracji | C / C ++ | Generowanie kodu ”, wybierz„ Debugowanie wielowątkowe (/ MTd) ”w celu konfiguracji debugowania.
Pamiętaj, że nie zmienia to ustawień konfiguracji wydania - musisz przejść do tej samej lokalizacji i wybrać opcję „Wielowątkowe (/ MT)” dla wydania.
źródło
Kliknij projekt prawym przyciskiem myszy, wybierz Właściwości, a następnie w obszarze „Właściwości konfiguracji | Łącznik | Wejście | Zignoruj konkretną bibliotekę i napisz msvcrtd.lib
źródło