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 |
Brak | Statycznie łączy UCRT z kodem. | /MT |
_MT |
libucrtd.lib |
Brak | 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 |
Brak | Statycznie połączone z kodem. | /MT |
_MT |
libvcruntimed.lib |
Brak | 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.dll
programu , 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.lib
i 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 /clr
programem , 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>.dll programu ) |
/MD |
_MT , _DLL |
libcpmtd.lib |
Link wielowątkowy, statyczny | /MTd |
_DEBUG , _MT |
msvcprtd.lib |
Wielowątkowy, dynamiczny link (biblioteka importu dla msvcp<version>d.dll programu ) |
/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. Na 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.dll
program . 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++