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 |
Nic | Staticky propojuje UCRT s vaším kódem. | /MT |
_MT |
libucrtd.lib |
Nic | 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 |
Nic | Staticky propojené s vaším kódem. | /MT |
_MT |
libvcruntimed.lib |
Nic | 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.lib
a 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_RANGE
FP_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++