Soubory C runtime (CRT) a standardní knihovny C++ (STL) .lib

Tento článek obsahuje seznam souborů knihovny .lib modulu runtime Microsoft C, které můžete propojit při vývoji aplikace, a jejich přidružené možnosti kompilátoru a direktivy preprocesoru.

Informace o nasazení souborů modulu runtime jazyka C, které jsou nezbytné pro podporu vaší aplikace, najdete v tématu Redistribuce souborů Visual C++.

Pokud hledáte referenční informace k rozhraní API pro knihovnu modulu runtime jazyka C, přečtěte si referenční informace o knihovně modulu runtime jazyka C.

Poznámka

Implementace standardní knihovny C++ od Microsoftu se často označuje jako STL nebo Standardní knihovna šablon. I když je standardní knihovna C++ oficiálním názvem knihovny, jak je definováno ve standardu ISO 14882, kvůli oblíbenému použití "STL" a "Standardní knihovny šablon" ve vyhledávacích webech, občas tyto názvy používáme, abychom usnadnili nalezení naší dokumentace.

Z historického hlediska "STL" původně odkazovat na standardní knihovnu šablon napsanou Alexanderem Stepanovem. Části této knihovny byly standardizovány ve standardní knihovně jazyka C++. Standardní knihovna také zahrnuje knihovnu modulu runtime ISO C, části knihovny Boost a další funkce. Někdy se "STL" používá k odkazování na kontejnery a algoritmy částí standardní knihovny C++ přizpůsobené hodnotě STL stepanova. V této dokumentaci odkazuje standardní knihovna šablon (STL) na standardní knihovnu jazyka C++.

Soubory modulu runtime jazyka .lib C

Standardní knihovna ISO C je součástí standardní knihovny jazyka 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 statické propojení, propojení knihovny přímo s kódem nebo dynamické propojení, které umožní kódu používat běžné soubory DLL.

V sadě Visual Studio 2015 se CRT refaktoroval na nové binární soubory. Univerzální CRT (UCRT) obsahuje funkce a globální objekty exportované standardní knihovnou C99 CRT. UCRT je teď součástí Windows a dodává se jako součást Windows 10 a novějších verzí. Statická knihovna, knihovna pro import knihovny DLL a soubory hlaviček pro UCRT se teď nacházejí v sadě Windows SDK. Když nainstalujete Visual C++, instalační program sady Visual Studio nainstaluje podmnožinu sady Windows SDK potřebnou k použití UCRT. UCRT můžete použít v libovolné verzi Windows podporované sadou Visual Studio 2015 a novějšími verzemi. Můžete ho distribuovat pomocí nástroje vcredist pro podporované verze Windows jiné než Windows 10 nebo novější. Další informace naleznete v tématu Redistribuce souborů Visual C++.

Následující tabulka uvádí knihovny, které implementují UCRT.

Knihovna Přidružená knihovna DLL Charakteristiky Možnost Direktivy preprocesoru
libucrt.lib Žádné Staticky propojuje UCRT s vaším kódem. /MT _MT
libucrtd.lib Žádné Ladění verze UCRT pro statické propojení Nelze distribuovat. /MTd _DEBUG, _MT
ucrt.lib ucrtbase.dll Knihovna pro import knihovny DLL pro UCRT. /MD _MT, _DLL
ucrtd.lib ucrtbased.dll Knihovna dll importu pro ladicí verzi UCRT. Nelze distribuovat. /MDd _DEBUG, _MT, _DLL

Knihovna vcruntime obsahuje kód specifický pro implementaci jazyka Visual C++: podpora zpracování výjimek a ladění, kontroly modulu runtime a informace o typu, podrobnosti implementace a některé rozšířené funkce knihovny. Verze knihovny vcruntime musí odpovídat verzi kompilátoru, který používáte.

Tato tabulka uvádí knihovny, které implementují knihovnu vcruntime.

Knihovna Přidružená knihovna DLL Charakteristiky 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 pro import knihovny DLL pro vcruntime /MD _MT, _DLL
vcruntimed.lib vcruntime<version>d.dll Knihovna dll import knihovny pro ladění vcruntime. Nelze distribuovat. /MDd _DEBUG, _MT, _DLL

Poznámka

Při refaktoringu UCRT byly funkce Concurrency Runtime přesunuty do concrt140.dll, které byly přidány do distribuovatelného balíčku C++. Tato knihovna DLL je vyžadována pro paralelní kontejnery a algoritmy jazyka C++, například concurrency::parallel_for. Kromě toho standardní knihovna C++ vyžaduje tuto knihovnu DLL v systému Windows XP pro podporu primitiv synchronizace, protože systém 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á spouštění CRT, inicializaci interních dat pro jednotlivá vlákna 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 propojené UCRT.

Tato tabulka uvádí knihovny, které implementují inicializaci a ukončení CRT.

Knihovna Charakteristiky Možnost Direktivy preprocesoru
libcmt.lib Staticky propojuje nativní spuštění CRT s vaším kódem. /MT _MT
libcmtd.lib Staticky propojuje verzi ladění 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 knihovnou DLL UCRT a vcruntime. /MD _MT, _DLL
msvcrtd.lib Statická knihovna pro ladicí verzi nativního spuštění CRT pro použití s knihovnou 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 knihovnou DLL UCRT a vcruntime. /clr
msvcmrtd.lib Statická knihovna pro verzi ladění smíšené nativní a spravované spuštění CRT pro použití s knihovnou DLL UCRT a vcruntime. Nelze distribuovat. /clr
msvcurt.lib Zastaralá statická knihovna pro čistě spravovanou CRT. /clr:pure
msvcurtd.lib Zastaralá statická knihovna pro ladicí verzi čistě spravované 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: libcmt.lib, libvcruntime.liba libucrt.lib.

Použití staticky propojené CRT znamená, že všechny informace o stavu uložené knihovnou modulu runtime jazyka C budou místní pro danou instanci CRT. Pokud například používáte strtok staticky propojený CRT, pozice strtok analyzátoru nesouvisí se strtok 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é CRT. Naproti tomu dynamicky propojený crt sdílí stav pro veškerý kód v rámci procesu, který je dynamicky propojený s CRT. Tento problém se netýká, pokud používáte nové bezpečnější verze 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čujeme odkazovat staticky s CRT v knihovně DLL, pokud nejsou důsledky srozumitelné a požadované. Pokud například zavoláte _set_se_translator spustitelný soubor, 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řekladatelem, ale hardwarové výjimky generované kódem v hlavním spustitelném souboru budou zachyceny.

Pokud používáte přepínač kompilátoru /clr , váš kód se propojí se statickou knihovnou msvcmrt.lib. Statická knihovna poskytuje proxy server mezi spravovaným kódem a nativním CRT. Nelze použít staticky propojené CRT ( /MT nebo /MTd možnosti) s /clr. Použijte místo toho dynamicky propojené knihovny (/MD nebo /MDd). Čistě spravované knihovny CRT jsou v sadě Visual Studio 2015 zastaralé a v sadě Visual Studio 2017 nejsou podporované.

Další informace o použití CRT se smíšenými /clr(nativními a spravovanými) sestaveními.

Pokud chcete vytvořit ladicí verzi aplikace, _DEBUG musí být definovaný příznak a aplikace musí být propojená s ladicí verzí jedné z těchto knihoven. Další informace o použití ladicí verze souborů knihovny naleznete v tématu Techniky ladění CRT.

Tato verze CRT není plně v souladu se standardem C99. Ve verzích před sadou Visual Studio 2019 verze 16.8 se hlavička <tgmath.h> nepodporuje. Ve všech verzích CX_LIMITED_RANGEFP_CONTRACT nejsou makra pragma podporovaná. Některé prvky, jako je význam specifikátorů parametrů ve standardních vstupně-výstupních funkcích, používají ve výchozím nastavení starší interpretace. Můžete použít /Zc možnosti shody kompilátoru a určit možnosti linkeru pro řízení některých aspektů shody knihovny.

Soubory standardní knihovny C++ (STL) .lib

Standardní knihovna C++ Charakteristiky Možnost Direktivy preprocesoru
libcpmt.lib Vícevláknové, statické propojení /MT _MT
msvcprt.lib Vícevláknové, dynamické propojení (knihovna importu pro msvcp<version>.dll) /MD _MT, _DLL
libcpmtd.lib Vícevláknové, statické propojení /MTd _DEBUG, _MT
msvcprtd.lib Vícevláknové, dynamické propojení (knihovna importu pro msvcp<version>d.dll) /MDd _DEBUG, _MT, _DLL

Při vytváření verze verze projektu je jedna ze základních knihoven modulu runtime jazyka C (libcmt.lib, msvcmrt.lib, msvcrt.lib) ve výchozím nastavení propojena v závislosti na možnosti kompilátoru, kterou zvolíte (multithreaded, DLL, /clr). Pokud do kódu zahrnete jeden ze souborů hlaviček standardní knihovny C++, bude standardní knihovna jazyka C++ automaticky propojena jazykem Visual C++ při kompilaci. Příklad:

#include <ios>

Kvůli binární kompatibilitě může být více než jeden soubor DLL určen jednou knihovnou importu. Aktualizace verzí můžou představovat tečkované knihovny, samostatné knihovny DLL, které zavádějí nové funkce knihovny. Například Visual Studio 2017 verze 15.6 zavedlo msvcp140_1.dll pro podporu více standardních funkcí knihovny, aniž by došlo k narušení binárního rozhraní aplikace (ABI) podporované msvcp140.dll. Knihovna msvcprt.lib importu, která je součástí sady nástrojů pro Visual Studio 2017 verze 15.6, podporuje obě knihovny DLL a knihovna vcredist pro tuto verzi nainstaluje obě knihovny DLL. Jakmile ji odešlete, bude mít knihovna s tečkou opravenou ABI a nikdy nebude mít závislost na pozdější knihovně s tečkou.

Jaké problémy existují, pokud aplikace používá více než jednu verzi CRT?

Každá spustitelná image (EXE nebo DLL) může mít svůj vlastní staticky propojený CRT nebo může dynamicky propojit s CRT. Verze CRT staticky zahrnutá nebo dynamicky načtená konkrétní imagí závisí na verzi nástrojů a knihoven, pomocí které byla sestavena. Jeden proces může načíst více obrázků EXE a DLL, z nichž každý má vlastní CRT. Každý z těchto CRT může používat jiný alokátor, může mít různá rozložení vnitřní struktury a může používat různá uspořádání úložiště. To znamená, že přidělené paměti, prostředky CRT nebo třídy předávané přes hranice knihovny DLL mohou způsobit problémy se správou 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 předána a odstraněna jinou, která uvolnění CRT se používá? Příčinou chyb může být drobné až okamžité závažné, a proto se nedoporučuje přímý přenos těchto prostředků.

Mnoha těmto problémům se můžete vyhnout pomocí technologií ABI (Application Binary Interface), protože jsou navržené tak, aby byly stabilní a s možností správy verzí. Navrhněte rozhraní pro export knihovny DLL tak, aby předávala informace podle hodnoty nebo aby fungovala na paměti, která je předána volajícím, a nedělila se místně a vrácena volajícímu. Pomocí technik zařazování můžete kopírovat strukturovaná data mezi spustitelnými obrázky. Zapouzdřujte prostředky místně a povolte manipulaci pouze pomocí popisovačů nebo funkcí, které zveřejňujete klientům.

Některé z těchto problémů je také možné vyhnout, pokud všechny image ve vašem procesu používají stejnou dynamicky načtenou verzi CRT. Chcete-li zajistit, aby všechny komponenty používaly stejnou verzi knihovny DLL CRT, sestavte je pomocí /MD této možnosti a použijte stejnou sadu nástrojů kompilátoru a nastavení vlastností.

Buďte opatrní, pokud 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í, můžou způsobovat problémy, i když používáte stejnou verzi CRT. Další informace o souvisejících problémech a jejich řešení naleznete v tématu Potenciální chyby předávání objektů CRT přes hranice knihovny DLL.

Viz také

Referenční informace k knihovně modulu runtime jazyka C
Redistribuce souborů Visual C++