Biblioteka CRT — Funkcje
Ten temat omawia różne pliki .lib, które tworzą biblioteki wykonawcze języka C oraz skojarzone z nimi opcje kompilatora i dyrektywy preprocesora.
Biblioteki C-Run-Time (CRT)
Następujące biblioteki zawierają funkcje biblioteki wykonawczej języka C.
Biblioteka wykonawcza języka C (bez iostream i biblioteki standardowej C++) |
Skojarzone pliki DLL |
Charakterystyka |
Opcja |
Dyrektywy preprocesora |
---|---|---|---|---|
libcmt.lib |
Brak, łącze statyczne. |
Wielowątkowa, łącze statyczne |
_MT |
|
msvcrt.lib |
msvcr110.dll |
Wielowątkowa, łącze dynamiczne (importuj bibliotekę dla MSVCR110.DLL).Należy wziąć pod uwagę, że podczas użycia Biblioteki standardowej języka C++, program będzie potrzebował MSVCP110.DLL do uruchomienia. |
_MT, _DLL |
|
libcmtd.lib |
Brak, łącze statyczne |
Wielowątkowa, łącze statyczne (debug) |
/MTd |
_DEBUG, _MT |
msvcrtd.lib |
msvcr110d.dll |
Wielowątkowa, łącze dynamiczne (importuj bibliotekę dla MSVCR110D.DLL) (debug). |
/MDd |
_DEBUG, _MT, _DLL |
msvcmrt.lib |
Brak, łącze statyczne |
Biblioteka statyczna środowiska uruchomieniowego języka CUżywana do kodu mieszanego zarządzanego/natywnego. |
/clr /clr:oldSyntax |
|
msvcurt.lib |
Brak, łącze statyczne |
Biblioteka statyczna środowiska uruchomieniowego języka C, kompilowana do 100% czystego kodu MSIL.Cały kod kompilowany jest ze specyfikacją ECMA URT dla MSIL. |
/clr:pure |
|
[!UWAGA]
Jednowątkowa biblioteka CRT (libc.lib, libcd.lib) (wcześniej opcje /ML lub /MLd ) nie jest już dostępna.Zamiast tego użyj wielowątkowej biblioteki CRT.Zobacz Wydajność bibliotek wielowątkowych.
Jeśli nastąpi konsolidacja programu z wiersza polecenia bez opcji kompilatora, która określi bibliotekę wykonawczą języka C, konsolidator użyje LIBCMT.LIB.Różni się to od poprzednich wersji Visual C++, gdzie używano zamiast tego biblioteki jednowątkowej LIBC.LIB.
Używanie statycznie dołączonej biblioteki CRT implikuje, że dowolne informacje dotyczące stanu, zapisane przez bibliotekę środowiska uruchomieniowego języka C, będą lokalne dla tego wystąpienia CRT.Na przykład, jeśli użyto strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l podczas używania statycznie dołączonej biblioteki CRT, pozycja analizatora strtok będzie niezwiązana z stanem strtok używanym w kodzie w tym samym procesie (ale w innym pliku DLL lub EXE), który jest dołączony do innego wystąpienia statycznej biblioteki CRT.Dla kontrastu, dynamicznie dołączona biblioteka CRT współdzieli stan dla całego kodu wewnątrz procesu, który jest dynamicznie dołączony do CRT.Ta kwestia nie ma miejsca, jeśli używane są nowe, bezpieczniejsze wersje tych funkcji; na przykład dla strtok_s ten problem nie występuje.
Ponieważ biblioteka DLL, skompilowana przez dołączenie statycznej biblioteki CRT, będzie miała swój własny stan CRT, nie jest zalecane aby statycznie dołączać CRT do biblioteki DLL, chyba że konsekwencje takiego działania są pożądane i rozumiane.Na przykład w przypadku wywołania _set_se_translator w pliku wykonywalnym, który ładuje bibliotekę DLL, do której dołączono jej własną statyczną bibliotekę CRT, dowolne wyjątki sprzętowe, generowane przez kod w bibliotece DLL nie zostaną przechwycone przez tłumacza, ale wyjątki sprzętowe, generowane przez kod w głównym pliku wykonywalnym zostaną przechwycone.
Podczas używania przełącznika kompilatora /clr do kodu będzie dołączona statyczna biblioteka msvcmrt.lib.Statyczna biblioteka dostarcza proxy pomiędzy kodem zarządzanym a natywną biblioteką CRT.Nie można używać statycznie dołączonej biblioteki CRT ( opcje /MT lub /MTd ) z /clr.Zamiast tego należy użyć biblioteki dołączonej dynamicznie (/MD lub /MDd).
Podczas używania przełącznika kompilatora /clr:pure do kodu będzie dołączona statyczna biblioteka msvcurt.lib.Podobnie jak w przypadku /clr, nie można łączyć ze statycznie dołączoną biblioteką.
Aby uzyskać więcej informacji dotyczących używania biblioteki CRT z /clr, zobacz Zestawy mieszane (natywne i zarządzane); dla /clr:pure, zobacz Kod czysty i weryfikowalny (C++/CLI).
Aby skompilować wersję debug aplikacji, flaga _DEBUG musi być zdefiniowana i do aplikacji musi być dołączona wersja debug jednej z tych bibliotek.Aby uzyskać więcej informacji dotyczących używania wersji debug plików biblioteki, zobacz Techniki debugowania CRT.
Wersja Visual C++ nie jest zgodna ze standardem C99.
Standardowa biblioteka języka C++
Standardowa biblioteka języka C++ |
Charakterystyka |
Opcja |
Dyrektywy preprocesora |
---|---|---|---|
LIBCPMT.LIB |
Wielowątkowa, łącze statyczne |
/MT |
_MT |
MSVCPRT.LIB |
Wielowątkowa, łącze dynamiczne (importuj bibliotekę dla MSVCP110.dll) |
/MD |
_MT, _DLL |
LIBCPMTD.LIB |
Wielowątkowa, łącze statyczne |
/MTd |
_DEBUG, _MT |
MSVCPRTD.LIB |
Wielowątkowa, łącze dynamiczne (importuj bibliotekę dla MSVCP110D.DLL) |
/MDd |
_DEBUG, _MT, _DLL |
Uwaga LIBCP.LIB i LIBCPD.LIB (przez stare opcje /ML i /MLd ) zostały usunięte.Zamiast tego należy używać LIBCPMT.LIB i LIBCPMTD.LIB przez opcje /MT i /MTd.
Podczas kompilacji wersji wydania projektu, jedna z podstawowych bibliotek wykonawczych języka C (LIBCMT.LIB, MSVCMRT.LIB, MSVCRT.LIB) jest domyślnie dołączona w zależności od wybranej opcji kompilatora (wielowątkowy, DLL, /clr).Jeśli w kodzie zostanie dołączony jeden z Pliki nagłówkowe standardowej biblioteki języka C++, biblioteka standardowa języka C++ będzie dołączona automatycznie przez Visual C++ w czasie kompilacji.Na przykład:
#include <ios>
Jaka jest różnica pomiędzy msvcrt.dll a msvcr110.dll?
msvcrt.dll jest teraz "znaną DLL", co oznacza, że jest składnikiem systemu, który należy do systemu Windows i jest przez niego kompilowany.Jest to zamierzone tylko dla użytku w przyszłości przez składniki na poziomie systemu.
Jakie problemy występują, jeśli aplikacja używa zarówno msvcrt.dll jak i msvcr110.dll?
Jeśli posiadasz plik .lib lub .obj, który potrzebuje dołączyć msvcrt.lib, nie powinna zachodzić konieczność ponownej kompilacji go aby działał z nowym msvcrt.lib w Visual C++.Pliki .lib lub .obj mogą polegać na rozmiarach, przesunięciach pól, nazwach funkcji członkowskich różnych klas lub zmiennych biblioteki CRT, a te powinny istnieć nadal w sposób zgodny.Podczas ponownego dołączenia msvcrt.lib, ostateczne obrazy plików EXE i DLL będą zależne od msvcr110.dll zamiast msvcrt.dll.
Jeśli istnieje więcej niż jeden plik DLL lub EXE, może być więcej niż jedna biblioteka CRT, niezależnie od tego czy używane są różne wersje Visual C++.Na przykład statyczne dołączenie biblioteki CRT do wielu plików DLL może spowodować wystąpienie tego samego problemu.Deweloperzy, którzy napotkają ten problem dla statycznych bibliotek CRT, powinni kompilować z opcją /MD aby użyć pliku DLL biblioteki CRT.Obecnie, kiedy nazwa pliku DLL biblioteki CRT została zmieniona na msvcr110.dll, niektóre składniki aplikacji mogą mieć dołączone msvcrt.dll a inne msvcr110.dll.Jeśli plik DLL przekazuje zasoby biblioteki CRT poprzez granicę między msvcrt.dll a msvcr110.dll, napotkany zostanie problem niezgodności bibliotek CRT i konieczna będzie ponowna kompilacja projektu przy użyciu Visual C++.
Jeśli program używa więcej niż jednej wersji biblioteki CRT, należy zachować ostrożność podczas przekazywania konkretnych obiektów biblioteki CRT (takich jak uchwyty plików, ustawienia regionalne i zmienne środowiskowe) poprzez granice DLL.Aby uzyskać więcej informacji dotyczących związanych problemów i tego, jak je rozwiązać, zobacz Potencjalne przekazywanie błędów obiektów CRT w poprzek granic DLL.