Funkce knihovny CRT
Toto téma popisuje různých lib souborů, které tvoří knihoven C run-time jakož i jejich – možnosti kompilátoru přidružené a preprocessor direktivy.
Běhové knihovny jazyka C (CRT)
Následující knihovny obsahují funkce jazyka C run-time library.
Knihovna C run-time (bez iostream nebo standardní knihovny C++) |
Přidružené knihovny DLL |
Vlastnosti |
Možnost |
Preprocessor direktivy |
---|---|---|---|---|
Libcmt.lib |
Žádné, statické propojení. |
Ve více vláknech, statické propojení |
_MT |
|
Msvcrt.lib |
msvcr120.dll |
Ve více vláknech, dynamická odkaz (import knihovny MSVCR120. KNIHOVNA DLL).Je potřeba upozornit, pokud chcete používat standardní knihovny C++, váš program bude nutné MSVCP120. Knihovna DLL pro spuštění. |
_MT, _DLL |
|
libcmtd.lib |
Žádná, statické propojení |
Ve více vláknech, statické odkaz (ladění) |
_DEBUG, _MT |
|
msvcrtd.lib |
msvcr120d.dll |
Ve více vláknech, dynamická odkaz (import knihovny MSVCR120D. Knihovna DLL) (ladění). |
_DEBUG, _MT, _DLL |
|
msvcmrt.lib |
Žádná, statické propojení |
Statické knihoven C Runtime.Použít pro smíšený spravované/nativní kód. |
|
|
Msvcurt.lib |
Žádná, statické propojení |
Statické knihovny C Runtime kompilované jako 100 % čistém MSIL kódu.Všechny kódu v souladu s ECMA URT specifikace pro MSIL. |
|
[!POZNÁMKA]
Jeden podproces CRT (libc.lib, libcd.lib) (dříve /ML nebo /MLd Možnosti) již není k dispozici.Místo toho použijte ve více vláknech CRT.Podívejte se na téma Výkon vícevláknových knihoven.
Pokud vytváříte odkaz svůj program z příkazového řádku bez možnosti kompilátoru, která určuje knihovnu C run-time, propojovací program bude používat LIBCMT. LIB.Tím se liší od předchozích verzí aplikace Visual C++, který používá LIBC. LIB, knihovna jeden podproces, místo toho.
Pomocí staticky propojené CRT znamená, že všechny informace o stavu uložené C runtime library bude být místní instanci CRT.Například, pokud použijete strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l při použití staticky propojené CRT, umístění strtok Analyzátor je nezávislá na strtok Stav, použit v kódu ve stejném procesu (ale v různých knihovny DLL a EXE), který je přidružen k jiné instanci statické CRT.Dynamicky propojené CRT naopak sdílí stavu pro všechny kódu v rámci procesu dynamicky propojenou CRT.Tento problém není platné, pokud použijete nové bezpečnější verze z těchto funkcí; Můžete například strtok_s nemá tento problém.
Vzhledem k tomu, že soubor DLL sestaven propojením s statické CRT bude mít stavu CRT, nedoporučuje staticky propojit k CRT v knihovně DLL pouze v případě dopadech tohoto konkrétně požadovaných a srozumitelná.Například při volání _set_se_translator v spustitelný soubor, který načte knihovnu DLL propojené s vlastním statické CRT, nesmí být žádné hardwarové výjimky generovaných kódu v knihovně DLL zachycena překladač, ale bude být zachycena hardwarové výjimky generovaných kódu v hlavní spustitelný soubor.
Pokud používáte /clr přepínače kompilátoru váš kód bude propojena s statické knihovny, msvcmrt.lib.Statické knihovny poskytuje proxy server mezi váš spravovaný kód a nativní CRT.Nelze použít staticky propojené CRT ( /MT nebo /MTd Možnosti) s /clr.Používat dynamicky propojené knihovny (/MD nebo /MDd) místo toho.
Pokud používáte /clr:pure přepínače kompilátoru váš kód bude propojena s msvcurt.lib statické knihovny.Stejně jako u /clr, nelze propojit s knihovnou staticky propojený.
Další informace o používání CRT s /clr, naleznete v části Smíšená (nativní a spravovaná) sestavení; pro /clr:pure, naleznete v části Čistý a ověřitelný kód (C++/CLI).
K sestavení ladicí verze aplikace, _DEBUG příznak musí být definován a aplikace musí být spojeny s ladicí verze jednoho z těchto knihoven.Další informace o použití ladicí verze ze souborů knihoven, naleznete v části techniky ladění CRT.
Tato verze Visual C++ není splňovaly standardní C99.
Standardní knihovna C++
Standardní knihovna C++ |
Vlastnosti |
Možnost |
Preprocessor direktivy |
---|---|---|---|
LIBCPMT. LIB |
Ve více vláknech, statické propojení |
/MT |
_MT |
MSVCPRT. LIB |
Ve více vláknech, dynamická odkaz (import v knihovně MSVCP120.dll) |
/MD |
_MT, _DLL |
LIBCPMTD. LIB |
Ve více vláknech, statické propojení |
/MTd |
_DEBUG, _MT |
MSVCPRTD. LIB |
Ve více vláknech, dynamická odkaz (import knihovny MSVCP120D. KNIHOVNA DLL) |
/MDd |
_DEBUG, _MT, _DLL |
Poznámka: LIBCP. LIB a LIBCPD. LIB (prostřednictvím stará /ML a /MLd Možnosti) byly odebrány.Pomocí LIBCPMT. LIB a LIBCPMTD. Místo toho LIB prostřednictvím /MT a /MTd Možnosti.
Při vytváření prodejní verzi projektu, jednu z základní knihoven C run-time (LIBCMT. LIB, MSVCMRT. LIB, MSVCRT. Ve výchozím nastavení je propojen LIB), v závislosti na možnosti kompilátoru můžete zvolit (ve více vláknech, knihovna DLL, / CLR).Je-li zahrnout jeden z Standardní knihovna C++ – hlavičkové soubory ve vašem kódu standardní knihovny C++ bude propojena v automaticky aplikace Visual C++ v době kompilace.Příklad:
#include <ios>
Chcete-li změnit, které základní knihovna C run-time je propojena v sadě Visual Studio, otevřete na stránkách vlastností pro váš projekt.Otevřít Vlastnosti konfigurace, C/C++, generování kódu stránky a změňte Runtime Library nastavení.Chcete-li změnit Common Language Runtime knihoven, otevřete na stránkách vlastností pro váš projekt.Otevřít Vlastnosti konfigurace, C/C++, Obecné stránky a poté změňte Common Language RunTime Support nastavení.
Jaký je rozdíl mezi msvcrt.dll a msvcr120.dll?
Msvcrt.dll je nyní "Známé soubor DLL," znamená, že je systémová součást majetkem a vytvoření v systému Windows.Je určena pro budoucí použití pouze komponentami úrovni systému.
Jaké problémy existovat, pokud aplikace používá msvcrt.dll a msvcr120.dll?
Pokud máte LIB nebo .obj soubor, který potřebuje pro připojení k msvcrt.lib, pak by neměl muset znovu zkompilovat pro práci s novou msvcrt.lib v jazyce Visual C++.Soubor LIB nebo .obj může spoléhají na velikostí, posun pole nebo funkce názvy členů z různých tříd CRT nebo proměnné a ty, by měl všechny stále existovat kompatibilní způsobem.Při změně vazby proti msvcrt.lib, konečný obraz EXE a DLL nyní mít závislost na msvcr120.dll namísto msvcrt.dll.
Pokud máte více než jeden soubor DLL nebo EXE, pak může mít více než jeden CRT, zda používáte různé verze Visual C++.Můžete například statického propojení CRT do různých knihoven DLL může představovat stejný problém.Vývojáři dochází k tomuto problému s statické CRTs jste dostali pokyn ke kompilaci s /MD používat CRT knihovny DLL.Teď, když CRT knihovny DLL byl přejmenován na msvcr120.dll, aplikace mohou mít některé součásti propojen msvcr120.dll msvcrt.dll a ostatním uživatelům.Pokud vaše DLL knihovny úspěšně CRT prostředků přes hranice msvcrt.dll a msvcr120.dll, bude dojde k potížím s odlišnými CRTs a je třeba znovu zkompilovat svého projektu pomocí jazyka Visual C++.
Pokud váš program používá více než jednu verzi CRT, některé stará nad rámec hranic knihovny DLL je potřeba při předávání některých CRT objekty (například popisovače souborů, národní prostředí a proměnné prostředí).Další informace o problémech účastníky a jejich řešení naleznete v tématu Možné chyby při předávání objektů CRT přes hranice knihovny DLL.