Pliki standardowej biblioteki CRT (CRT) i biblioteki standardowej języka C++ (STL) .lib

W tym artykule wymieniono pliki biblioteki środowiska uruchomieniowego języka .lib Microsoft C, które można połączyć podczas tworzenia aplikacji, oraz skojarzone z nimi opcje kompilatora i dyrektywy preprocesora.

Jeśli szukasz informacji na temat wdrażania plików środowiska uruchomieniowego języka C niezbędnych do obsługi aplikacji, zobacz Redistributing Visual C++ files (Ponowne dystrybuowanie plików języka Visual C++).

Zobacz dokumentację biblioteki środowiska uruchomieniowego języka C, jeśli szukasz dokumentacji interfejsu API dla biblioteki środowiska uruchomieniowego języka C.

Uwaga

Implementacja standardowej biblioteki języka C++ firmy Microsoft jest często nazywana biblioteką szablonów STL lub Standard. Mimo że standardowa biblioteka języka C++ jest oficjalną nazwą biblioteki zdefiniowaną w standardzie ISO 14882, ze względu na popularne użycie biblioteki "STL" i "Standardowej biblioteki szablonów" w wyszukiwarkach, od czasu do czasu używamy tych nazw, aby ułatwić znalezienie naszej dokumentacji.

Z perspektywy historycznej "STL" pierwotnie odniósł się do standardowej biblioteki szablonów napisanej przez Alexandra Stepanova. Części tej biblioteki zostały ustandaryzowane w standardowej bibliotece języka C++. Biblioteka standardowa zawiera również bibliotekę środowiska uruchomieniowego ISO C, części biblioteki Boost i inne funkcje. Czasami "STL" służy do odwoływania się do kontenerów i algorytmów części standardowej biblioteki języka C++ dostosowanej z biblioteki STL Stepanov. W tej dokumentacji biblioteka szablonów standardowych (STL) odnosi się do standardowej biblioteki języka C++ jako całości.

Pliki środowiska uruchomieniowego .lib języka C

Standardowa biblioteka ISO C jest częścią standardowej biblioteki języka C++. Biblioteki języka Visual C++, które implementują język CRT, obsługują tworzenie kodu natywnego oraz mieszany kod natywny i zarządzany. Wszystkie wersje CRT obsługują programowanie wielowątkowy. Większość bibliotek obsługuje zarówno łączenie statyczne, jak i łączenie biblioteki bezpośrednio z kodem lub łączenie dynamiczne, aby umożliwić kodowi używanie typowych plików DLL.

W programie Visual Studio 2015 CRT został refaktoryzowany do nowych plików binarnych. Uniwersalny CRT (UCRT) zawiera funkcje i globalne wyeksportowane przez standardową bibliotekę CRT C99. UCRT jest teraz składnikiem systemu Windows i jest dostarczany w ramach systemu Windows 10 i nowszych wersji. Biblioteka statyczna, biblioteka importu biblioteki DLL i pliki nagłówkowe dla narzędzia UCRT są teraz dostępne w zestawie Windows SDK. Podczas instalowania programu Visual C++instalator programu Visual Studio instaluje podzbiór zestawu Windows SDK wymaganego do korzystania z narzędzia UCRT. Możesz użyć narzędzia UCRT w dowolnej wersji systemu Windows obsługiwanej przez program Visual Studio 2015 i nowsze wersje. Można go ponownie rozpowszechnić przy użyciu narzędzia vcredist w przypadku obsługiwanych wersji systemu Windows innych niż Windows 10 lub nowszy. Aby uzyskać więcej informacji, zobacz Redystrybucja plików Visual C++.

W poniższej tabeli wymieniono biblioteki implementujące narzędzie UCRT.

Biblioteka Skojarzona biblioteka DLL Charakterystyki Opcja Dyrektywy preprocesora
libucrt.lib None Statycznie łączy UCRT z kodem. /MT _MT
libucrtd.lib None Debugowanie wersji narzędzia UCRT na potrzeby łączenia statycznego. Nie redystrybucyjny. /MTd _DEBUG, _MT
ucrt.lib ucrtbase.dll Biblioteka importowania biblioteki DLL dla UCRT. /MD _MT, _DLL
ucrtd.lib ucrtbased.dll Biblioteka importu biblioteki DLL dla wersji debugowania narzędzia UCRT. Nie redystrybucyjny. /MDd _DEBUG, _MT, _DLL

Biblioteka vcruntime zawiera kod specyficzny dla implementacji CRT języka Visual CRT: obsługa wyjątków i obsługa debugowania, kontrole środowiska uruchomieniowego i informacje o typie, szczegóły implementacji i niektóre funkcje rozszerzonej biblioteki. Wersja biblioteki vcruntime musi być zgodna z wersją używanego kompilatora.

W tej tabeli wymieniono biblioteki implementujące bibliotekę vcruntime.

Biblioteka Skojarzona biblioteka DLL Charakterystyki Opcja Dyrektywy preprocesora
libvcruntime.lib None Statycznie połączone z kodem. /MT _MT
libvcruntimed.lib None Wersja debugowania na potrzeby łączenia statycznego. Nie redystrybucyjny. /MTd _MT, _DEBUG
vcruntime.lib vcruntime<version>.dll Biblioteka importu biblioteki DLL dla programu vcruntime. /MD _MT, _DLL
vcruntimed.lib vcruntime<version>d.dll Biblioteka importu biblioteki DLL debugowania vcruntime. Nie redystrybucyjny. /MDd _DEBUG, _MT, _DLL

Uwaga

Gdy funkcja UCRT została refaktoryzowana, funkcje środowiska uruchomieniowego współbieżności zostały przeniesione do concrt140.dllprogramu , który został dodany do pakietu redystrybucyjnego języka C++. Ta biblioteka DLL jest wymagana dla równoległych kontenerów i algorytmów języka C++, takich jak concurrency::parallel_for. Ponadto biblioteka standardowa języka C++ wymaga tej biblioteki DLL w systemie Windows XP do obsługi elementów pierwotnych synchronizacji, ponieważ system Windows XP nie ma zmiennych warunku.

Kod, który inicjuje CRT, znajduje się w jednej z kilku bibliotek na podstawie tego, czy biblioteka CRT jest statycznie lub dynamicznie połączona, czy natywna, zarządzana, czy mieszana. Ten kod obsługuje uruchamianie CRT, wewnętrzne inicjowanie danych na wątek i kończenie. Jest on specyficzny dla używanej wersji kompilatora. Ta biblioteka jest zawsze statycznie połączona, nawet jeśli używasz dynamicznie połączonego interfejsu UCRT.

W tej tabeli wymieniono biblioteki implementujące inicjowanie i kończenie działania CRT.

Biblioteka Charakterystyki Opcja Dyrektywy preprocesora
libcmt.lib Statycznie łączy natywne uruchamianie narzędzia CRT z kodem. /MT _MT
libcmtd.lib Statycznie łączy wersję debugowania natywnego uruchamiania CRT. Nie redystrybucyjny. /MTd _DEBUG, _MT
msvcrt.lib Biblioteka statyczna natywnego uruchamiania CRT do użycia z biblioteką DLL UCRT i vcruntime. /MD _MT, _DLL
msvcrtd.lib Biblioteka statyczna dla wersji debugowania natywnego uruchamiania CRT do użycia z bibliotekami DLL UCRT i vcruntime. Nie redystrybucyjny. /MDd _DEBUG, _MT, _DLL
msvcmrt.lib Biblioteka statyczna dla mieszanego natywnego i zarządzanego uruchamiania CRT do użycia z bibliotekami DLL UCRT i vcruntime. /clr
msvcmrtd.lib Biblioteka statyczna dla wersji debugowania mieszanego natywnego i zarządzanego uruchamiania CRT do użycia z bibliotekami DLL UCRT i vcruntime. Nie redystrybucyjny. /clr
msvcurt.lib Przestarzała biblioteka statyczna dla czystej zarządzanej biblioteki CRT. /clr:pure
msvcurtd.lib Przestarzała biblioteka statyczna dla wersji debugowania czystej zarządzanej biblioteki CRT. Nie redystrybucyjny. /clr:pure

Jeśli połączysz program z wiersza polecenia bez opcji kompilatora, która określa bibliotekę środowiska uruchomieniowego języka C, konsolidator użyje statycznie połączonych bibliotek CRT: libcmt.lib, libvcruntime.libi libucrt.lib.

Użycie statycznie połączonego CRT oznacza, że wszystkie informacje o stanie zapisane przez bibliotekę środowiska uruchomieniowego języka C będą lokalne dla tego wystąpienia CRT. Jeśli na przykład używasz strtok statycznie połączonego CRT, pozycja strtok analizatora nie jest powiązana ze strtok stanem używanym w kodzie w tym samym procesie (ale w innej biblioteki DLL lub EXE), która jest połączona z innym wystąpieniem statycznego CRT. Z kolei dynamicznie połączony stan udziałów CRT dla całego kodu w procesie, który jest dynamicznie połączony z CRT. Ta kwestia nie ma zastosowania, jeśli używasz nowych bezpieczniejszych wersji tych funkcji; na przykład strtok_s nie ma tego problemu.

Ponieważ biblioteka DLL utworzona przez połączenie ze statycznym CRT ma własny stan CRT, nie zalecamy statycznego łączenia z CRT w dll, chyba że konsekwencje są zrozumiałe i pożądane. Jeśli na przykład wywołasz _set_se_translator plik wykonywalny, który ładuje bibliotekę DLL połączoną z własnym statycznym plikiem CRT, wszelkie wyjątki sprzętowe wygenerowane przez kod w dll nie zostaną przechwycone przez tłumacza, ale wyjątki sprzętowe generowane przez kod w głównym pliku wykonywalnym zostaną przechwycone.

Jeśli używasz przełącznika kompilatora/clr, kod zostanie połączony z biblioteką statyczną . msvcmrt.lib Biblioteka statyczna udostępnia serwer proxy między kodem zarządzanym a natywnym CRT. Nie można użyć statycznie połączonego CRT ( /MT lub /MTd opcji) z /clr. Zamiast tego użyj dynamicznie połączonych bibliotek (/MD lub /MDd). Czyste zarządzane biblioteki CRT są przestarzałe w programie Visual Studio 2015 i nieobsługiwane w programie Visual Studio 2017.

Aby uzyskać więcej informacji na temat używania CRT z /clrprogramem , zobacz Zestawy mieszane (natywne i zarządzane).

Aby utworzyć wersję debugowania aplikacji, _DEBUG należy zdefiniować flagę, a aplikacja musi być połączona z wersją debugowania jednej z tych bibliotek. Aby uzyskać więcej informacji na temat używania wersji debugowania plików biblioteki, zobacz Techniki debugowania CRT.

Ta wersja CRT nie jest w pełni zgodna ze standardem C99. W wersjach wcześniejszych niż program Visual Studio 2019 w wersji 16.8 <tgmath.h> nagłówek nie jest obsługiwany. We wszystkich wersjach makra CX_LIMITED_RANGE i FP_CONTRACT pragma nie są obsługiwane. Niektóre elementy, takie jak znaczenie specyfikatorów parametrów w standardowych funkcjach we/wy, domyślnie używają starszych interpretacji. Można użyć /Zc opcji zgodności kompilatora i określić opcje konsolidatora, aby kontrolować niektóre aspekty zgodności biblioteki.

Pliki standardowej biblioteki języka C++ (STL) .lib

Standardowa biblioteka C++ Charakterystyki Opcja Dyrektywy preprocesora
libcpmt.lib Link wielowątkowy, statyczny /MT _MT
msvcprt.lib Wielowątkowy, dynamiczny link (biblioteka importu dla msvcp<version>.dllprogramu ) /MD _MT, _DLL
libcpmtd.lib Link wielowątkowy, statyczny /MTd _DEBUG, _MT
msvcprtd.lib Wielowątkowy, dynamiczny link (biblioteka importu dla msvcp<version>d.dllprogramu ) /MDd _DEBUG, _MT, _DLL

Podczas kompilowania wersji projektu jedna z podstawowych bibliotek środowiska uruchomieniowego języka C (libcmt.lib, msvcmrt.lib, msvcrt.lib) jest domyślnie połączona w zależności od wybranej opcji kompilatora (wielowątkowy, DLL, /clr). Jeśli w kodzie dołączysz jeden ze standardowych plików nagłówków biblioteki języka C++, biblioteka standardowa języka C++ zostanie połączona automatycznie przez program Visual C++ w czasie kompilacji. Przykład:

#include <ios>

W celu zapewnienia zgodności binarnej można określić więcej niż jeden plik DLL przez jedną bibliotekę importu. Aktualizacje wersji mogą wprowadzać biblioteki kropkowe, oddzielne biblioteki DLL, które wprowadzają nowe funkcje biblioteki. Na przykład program Visual Studio 2017 w wersji 15.6 wprowadzono msvcp140_1.dll obsługę bardziej standardowych funkcji biblioteki bez przerywania działania interfejsu binarnego aplikacji (ABI) obsługiwanego przez msvcp140.dllprogram . Biblioteka msvcprt.lib importu zawarta w zestawie narzędzi programu Visual Studio 2017 w wersji 15.6 obsługuje biblioteki DLL, a biblioteka vcredist dla tej wersji instaluje obie biblioteki DLL. Po wysłaniu biblioteka kropkowa ma stałą bibliotekę ABI i nigdy nie będzie mieć zależności od późniejszej biblioteki kropkowej.

Jakie problemy istnieją, jeśli aplikacja używa więcej niż jednej wersji CRT?

Każdy obraz wykonywalny (EXE lub DLL) może mieć własny statycznie połączony CRT lub może dynamicznie łączyć się z CRT. Wersja CRT uwzględniana statycznie w pliku lub dynamicznie ładowana przez określony obraz zależy od wersji narzędzi i bibliotek, za pomocą których został skompilowany. Pojedynczy proces może załadować wiele obrazów EXE i DLL, z których każdy ma własne środowisko CRT. Każdy z tych CTT może używać innego alokatora, może mieć różne układy struktury wewnętrznej i może używać różnych układów magazynowania. Oznacza to, że przydzielona pamięć, zasoby CRT lub klasy przekazywane przez granicę biblioteki DLL mogą powodować problemy z zarządzaniem pamięcią, wewnętrznym użyciem statycznym lub interpretacją układu. Jeśli na przykład klasa jest przydzielana w jednej dll, ale przekazana do innej, która z nich jest używana, który przydział CRT jest używany? Błędy spowodowane mogą wahać się od subtelnych do natychmiast krytycznych, a zatem bezpośrednie przesyłanie takich zasobów jest zniechęcane.

Zamiast tego można uniknąć wielu z tych problemów przy użyciu technologii interfejsu binarnego aplikacji (ABI), ponieważ są one przeznaczone do stabilnego i możliwego do obsługi wersji. Zaprojektuj interfejsy eksportu bibliotek DLL, aby przekazać informacje według wartości lub pracować nad pamięcią przekazywaną przez obiekt wywołujący, a nie przydzielone lokalnie i zwrócone do wywołującego. Użyj technik marshalingu, aby skopiować dane ustrukturyzowane między obrazami wykonywalnych. Hermetyzowanie zasobów lokalnie i zezwalanie na manipulowanie tylko za pośrednictwem dojść lub funkcji udostępnianych klientom.

Istnieje również możliwość uniknięcia niektórych z tych problemów, jeśli wszystkie obrazy w procesie używają tej samej dynamicznie załadowanej wersji CRT. Aby upewnić się, że wszystkie składniki używają tej samej wersji biblioteki DLL CRT, skompiluj je przy użyciu /MD opcji i użyj tego samego zestawu narzędzi kompilatora i ustawień właściwości.

Należy zachować ostrożność, jeśli program przekazuje niektóre zasoby CRT przez granice biblioteki DLL. Zasoby, takie jak dojścia do plików, ustawienia regionalne i zmienne środowiskowe, mogą powodować problemy, nawet w przypadku korzystania z tej samej wersji CRT. Aby uzyskać więcej informacji na temat zaangażowanych problemów i sposobu ich rozwiązywania, zobacz Potencjalne błędy przekazywania obiektów CRT przez granice bibliotek DLL.

Zobacz też

Dokumentacja biblioteki środowiska uruchomieniowego języka C
Ponowne dystrybuowanie plików programu Visual C++