Soubory knihovny C runtime (CRT) a C++ Standard Library (STL) .lib
Toto téma obsahuje seznam souborů knihovny modulu runtime Jazyka Microsoft C, se kterou můžete při vývoji aplikace odkazovat, a jejich přidružené možnosti kompilátoru a .lib direktivy preprocesoru.
Pokud hledáte informace o nasazení souborů modulu runtime jazyka C potřebných pro podporu vaší aplikace, podívejte se na redistribuci souborů Visual C++ souborů.
Pokud hledáte referenční informace k rozhraní API pro knihovnu modulu runtime jazyka C, podívejte se na referenční informace ke knihovně modulu runtime jazyka C.
Soubory modulu runtime jazyka C .lib
Knihovna C runtime (CRT) je součástí standardní knihovny C++, která zahrnuje standardní knihovnu ISO C. Knihovny Visual C++, které implementují CRT, podporují vývoj nativního kódu a smíšený nativní i spravovaný kód. Všechny verze CRT podporují vývoj s více vlákny. Většina knihoven podporuje jak statické propojení, tak i propojení knihovny přímo s vaším kódem, nebo dynamické propojení, které kódu umožňují používat běžné soubory DLL.
Počínaje Visual Studio 2015 se CRT refaktoroval do nových binárních souborů. Universal CRT (UCRT) obsahuje funkce a globální hodnoty exportované standardní knihovnou CRT C99. UCRT je nyní součástí Windows a dodává se jako součást Windows 10 a novějších verzí. Statická knihovna, knihovna importu knihoven DLL a soubory hlaviček pro UCRT se teď nacházejí v Windows SDK. Když nainstalujete Visual C++, Visual Studio instalace nainstaluje podmnožinu sady SDK Windows pro použití UCRT. UCRT můžete použít v jakékoli verzi Windows podporovaných Visual Studio 2015 a novějšími verzemi. Můžete ho znovu distribuovat pomocí nástroje vcredist pro podporované verze Windows než Windows 10 nebo novější. Další informace najdete v tématu Redistribuce Visual C++ souborů.
Následující tabulka uvádí knihovny, které implementují UCRT.
| Knihovna | Přidružená knihovna DLL | Vlastnosti | Možnost | Direktivy preprocesoru |
|---|---|---|---|---|
libucrt.lib |
Žádné | Staticky prodá UCRT do vašeho kódu. | /MT |
_MT |
libucrtd.lib |
Žádné | Ladicí verze UCRT pro statické propojení. Nelze distribuovat. | /MTd |
_DEBUG, _MT |
ucrt.lib |
ucrtbase.dll |
Knihovna importu knihovny DLL pro UCRT. | /MD |
_MT, _DLL |
ucrtd.lib |
ucrtbased.dll |
Knihovna importu knihoven DLL pro ladicí verzi UCRT. Nelze distribuovat. | /MDd |
_DEBUG, _MT, _DLL |
Knihovna vcruntime obsahuje Visual C++ kódu specifického pro implementaci CRT, jako je podpora zpracování a ladění výjimek, kontroly modulu runtime a informace o typu, podrobnosti implementace a některé funkce rozšířené knihovny. Verze knihovny vcruntime musí odpovídat verzi kompilátoru, kterou používáte.
Tato tabulka uvádí knihovny, které implementují knihovnu vcruntime.
| Knihovna | Přidružená knihovna DLL | Vlastnosti | Možnost | Direktivy preprocesoru |
|---|---|---|---|---|
libvcruntime.lib |
Žádné | Staticky propojené s vaším kódem. | /MT |
_MT |
libvcruntimed.lib |
Žádné | Ladicí verze pro statické propojení. Nelze distribuovat. | /MTd |
_MT, _DEBUG |
vcruntime.lib |
vcruntime<version>.dll |
Knihovna importu knihoven DLL pro vcruntime. | /MD |
_MT, _DLL |
vcruntimed.lib |
vcruntime<version>d.dll |
Knihovna importu knihoven DLL pro ladicí vcruntime. Nelze distribuovat. | /MDd |
_DEBUG, _MT, _DLL |
Poznámka
Při refaktoringu UCRT byly Concurrency Runtime do , který byl přidán do concrt140.dll distribuovatelného balíčku C++. Tato knihovna DLL je vyžadována pro paralelní kontejnery a algoritmy jazyka C++, jako je concurrency::parallel_for například . Kromě toho standardní knihovna C++ vyžaduje tuto knihovnu DLL v systému Windows XP pro podporu primitiv synchronizace, protože Windows XP nemá proměnné podmínky.
Kód, který inicializuje CRT, je v jedné z několika knihoven na základě toho, jestli je knihovna CRT staticky nebo dynamicky propojená, nebo nativní, spravovaný nebo smíšený kód. Tento kód zpracovává spuštění CRT, vnitřní inicializaci dat pro vlákno a ukončení. Je specifický pro verzi použitého kompilátoru. Tato knihovna je vždy staticky propojená, i když používáte dynamicky propojenou knihovnu UCRT.
Tato tabulka uvádí knihovny, které implementují inicializaci a ukončení CRT.
| Knihovna | Vlastnosti | Možnost | Direktivy preprocesoru |
|---|---|---|---|
libcmt.lib |
Staticky prolíná nativní spuštění CRT s vaším kódem. | /MT |
_MT |
libcmtd.lib |
Staticky prolíná ladicí verzi nativního spuštění CRT. Nelze distribuovat. | /MTd |
_DEBUG, _MT |
msvcrt.lib |
Statická knihovna pro nativní spuštění CRT pro použití s knihovnami DLL UCRT a vcruntime. | /MD |
_MT, _DLL |
msvcrtd.lib |
Statická knihovna pro ladicí verzi nativního spuštění CRT pro použití s knihovnami DLL UCRT a vcruntime. Nelze distribuovat. | /MDd |
_DEBUG, _MT, _DLL |
msvcmrt.lib |
Statická knihovna pro smíšené nativní a spravované spuštění CRT pro použití s knihovnami DLL UCRT a vcruntime. | /clr |
|
msvcmrtd.lib |
Statická knihovna pro ladicí verzi smíšeného nativního a spravovaného spuštění CRT pro použití s knihovnami DLL UCRT a vcruntime. Nelze distribuovat. | /clr |
|
msvcurt.lib |
Zastaralé Statická knihovna pro čistě spravovanou knihovnu CRT. | /clr:pure |
|
msvcurtd.lib |
Zastaralé Statická knihovna pro ladicí verzi čistě spravovaného CRT. Nelze distribuovat. | /clr:pure |
Pokud program propojíte z příkazového řádku bez možnosti kompilátoru, která určuje knihovnu modulu runtime jazyka C, bude linker používat staticky propojené knihovny CRT: , a libcmt.liblibvcruntime.liblibucrt.lib .
Použití staticky propojeného crt znamená, že všechny informace o stavu uložené knihovnou modulu runtime jazyka C budou místní pro tuto instanci CRT. Pokud například použijete staticky propojený CRT, pozice analyzátoru nesouvisí se stavem použitým v kódu ve stejném procesu (ale v jiné knihovně DLL nebo EXE), která je propojena s jinou instancí statického strtokstrtokstrtok CRT. Naproti tomu dynamicky propojený CRT sdílí stav pro veškerý kód v rámci procesu, který je dynamicky propojený s CRT. Tato obava se netýká použití nových bezpečnějších verzí těchto funkcí. Například strtok_s tento problém nemá.
Vzhledem k tomu, že knihovna DLL vytvořená propojením se statickým crt má svůj vlastní stav CRT, nedoporučuje se statické propojení s CRT v knihovně DLL, pokud nejsou důsledky tohoto konkrétního stavu žádoucí a srozumitelné. Pokud například zavoláte ve spustitelném souboru, který načte knihovnu DLL propojenou s vlastním statickým CRT, všechny výjimky hardwaru vygenerované kódem v knihovně DLL nebudou zachyceny překladačem, ale výjimky hardwaru vygenerované kódem v hlavním spustitelném souboru budou _set_se_translator zachyceny.
Pokud používáte přepínač kompilátoru, váš kód bude propojený se statickou knihovnou /clr msvcmrt.lib. Statická knihovna poskytuje proxy mezi spravovaným kódem a nativním CRT. S nelze použít staticky propojený CRT ( /MT/MTd nebo možnosti) s /clr . Místo toho použijte dynamicky propojené knihovny ( /MD/MDd nebo ). Čistě spravované knihovny CRT jsou ve verzi Visual Studio 2015 zastaralé a v Visual Studio 2017 nejsou podporovány.
Další informace o použití CRT s najdete v /clr tématu /clra spravovaná) sestavení .
Chcete-li sestavit ladicí verzi aplikace, musí být definován příznak a aplikace musí být propojena s ladicí verzí jedné _DEBUG z těchto knihoven. Další informace o používání ladicích verzí souborů knihovny najdete v tématu Techniky ladění CRT.
Tato verze CRT není plně v souladu se standardem C99. Ve verzích Visual Studio 2019 verze 16.8 se hlavička < tgmath.h > nepodporuje. Ve všech verzích CX_LIMITED_RANGE nejsou FP_CONTRACT makra a pragma podporována. Některé prvky, jako je význam specifikátoru parametrů ve standardních funkcích V/V, používají ve výchozím nastavení starší interpretace. Můžete použít možnosti shody kompilátoru a určit /Zc možnosti linkeru pro řízení některých aspektů shody knihovny.
Soubory standardní knihovny .lib C++
| Standardní knihovna C++ | Vlastnosti | Možnost | Direktivy preprocesoru |
|---|---|---|---|
libcpmt.lib |
Vícevláknové statické propojení | /MT |
_MT |
msvcprt.lib |
Vícevláknové dynamické propojení (import knihovny pro msvcp<version>.dll ) |
/MD |
_MT, _DLL |
libcpmtd.lib |
Vícevláknové statické propojení | /MTd |
_DEBUG, _MT |
msvcprtd.lib |
Vícevláknové dynamické propojení (import knihovny pro msvcp<version>d.dll ) |
/MDd |
_DEBUG, _MT, _DLL |
Při sestavování vydání verze projektu je ve výchozím nastavení propojena jedna ze základních knihoven modulu runtime jazyka C ( , , ) v závislosti na volené možnosti kompilátoru libcmt.libmsvcmrt.libmsvcrt.lib (multithreaded, DLL, /clr ). Pokud do kódu zahrnete jeden ze souborů hlaviček standardní knihovny C++, standardní knihovna C++ bude automaticky propojena Visual C++ době kompilace. Například:
#include <ios>
Z důvodu binární kompatibility může být více než jeden soubor knihovny DLL určen jednou knihovnou importu. Aktualizace verzí mohou zavést tečkované knihovny, samostatné knihovny DLL, které zavádějí nové funkce knihovny. Například v Visual Studio 2017 verze 15.6 byla zavedena podpora dalších standardních funkcí knihovny bez přerušení binárního rozhraní aplikace msvcp140_1.dll (ABI) podporovaného rozhraním msvcp140.dll . Knihovna importu, která je součástí sady nástrojů pro msvcprt.lib Visual Studio 2017 verze 15.6, podporuje obě knihovny DLL a nástroj vcredist pro tuto verzi nainstaluje obě knihovny DLL. Po odeslání má tečková knihovna pevnou knihovnu ABI a nikdy nebude závislá na novější knihovně tečk.
K jakým problémům dochází, pokud aplikace používá více než jednu verzi CRT?
Každá spustitelná image (EXE nebo DLL) může mít vlastní staticky propojený CRT nebo může dynamicky propojit CRT. Verze CRT staticky zahrnutá v konkrétní ibitové kopii nebo dynamicky načtená závisí na verzi nástrojů a knihoven, pomocí kterých byla sestavena. Jeden proces může načíst více imagí EXE a DLL, z nichž každý má vlastní CRT. Každý z těchto seznamů CRT může používat jiný alokátor, může mít různá rozložení interní struktury a může používat různá uspořádání úložiště. To znamená, že přidělení paměti, prostředků CRT nebo tříd předáných přes hranice knihovny DLL může způsobit problémy se spravování paměti, interním statickým využitím nebo interpretací rozložení. Pokud je například třída přidělena v jedné knihovně DLL, ale je předána jiné knihovně a odstraněna jinou, který blok CRT se používá? Způsobené chyby mohou být v rozsahu od drobných po okamžitě závažné, a proto se důrazně nedoporučuje přímý přenos takových prostředků.
Mnoha těmto problémům se můžete vyhnout tím, že místo toho používáte technologie ABI (Application Binary Interface), protože jsou navržené tak, aby byly stabilní a určená pro správu verzí. Navrhujte rozhraní exportu knihovny DLL tak, aby předaly informace podle hodnoty, nebo aby pracovaly s pamětí předanou volajícím, nikoli přidělena místně a vrácena volajícímu. Ke kopírování strukturovaných dat mezi spustitelnými imagemi použijte techniky zařazování. Zapouzdřte prostředky místně a povolte manipulaci pouze prostřednictvím popisovačů nebo funkcí, které klientům zpřístupníte.
Některým z těchto problémů se také můžete vyhnout, pokud všechny image ve vašem procesu používají stejnou dynamicky načtenou verzi CRT. Pokud chcete zajistit, aby všechny komponenty měly stejnou verzi knihovny DLL CRT, sestavte je pomocí možnosti a použijte stejnou sada nástrojů kompilátoru a /MD nastavení vlastností.
Buďte opatrní, pokud váš program předává určité prostředky CRT přes hranice knihovny DLL. Prostředky, jako jsou popisovače souborů, národní prostředí a proměnné prostředí, mohou způsobit problémy, i když používáte stejnou verzi CRT. Další informace o souvisejících problémech a jejich řešení najdete v tématu Potenciální chyby při předávání objektů CRT přes hranice knihovny DLL.
Viz také
Referenční informace ke knihovně modulu runtime jazyka C
Redistribuce souborů Visual C++