Funkcje biblioteki CRT
W tym temacie omówiono różne pliki .lib biblioteki uruchomieniowej C, jak również ich opcje kompilatora skojarzone i dyrektywy preprocesora.
Biblioteki uruchomieniowej c (CRT)
Następujące biblioteki zawierają funkcje biblioteki uruchomieniowej C.
Biblioteka uruchomieniowa c (bez iostream lub standardowa biblioteka języka C++) |
Biblioteka DLL skojarzony |
Właściwości |
Opcja |
Dyrektywy preprocesora |
---|---|---|---|---|
LibCMt.lib |
Brak, statyczne łącze. |
Łącze wielowątkowe, statyczne |
_MT |
|
MSVCRT.lib |
msvcr110.dll |
Wielowątkowe, dynamic link (Importuj biblioteki MSVCR110.BIBLIOTEKA DLL).Należy pamiętać, że jeśli używana jest standardowa biblioteka języka C++, program będzie konieczne MSVCP110.DLL do uruchomienia. |
_MT, _DLL |
|
LibCMtD.lib |
Brak łącza statyczne |
Łącze wielowątkowe, statyczne (Debugowanie) |
/MTd |
_DEBUG, _MT |
MSVCRtD.lib |
msvcr110d.dll |
Wielowątkowe, dynamic link (Importuj biblioteki MSVCR110D.Biblioteka DLL) (Debugowanie). |
/MDd |
_DEBUG, _MT, _DLL |
łączona |
Brak łącza statyczne |
C Runtime library statyczne.Używane dla kodu zarządzanego i rodzimego mieszanych. |
/clr /clr:oldSyntax |
|
wersji produkcyjnej |
Brak łącza statyczne |
C Runtime library statyczne skompilowany jako 100% czystego kodu MSIL.Cały kod jest zgodny z specyfikacji ECMA narz dla MSIL. |
/clr:pure |
|
[!UWAGA]
CRT jednowątkowe (libc.lib, libcd.lib) (dawniej /ML lub /MLd opcje) nie jest już dostępny.Zamiast tego należy użyć wielowątkowe CRT.See Wielowątkowa bibliotek wydajności.
Jeśli program z wiersza polecenia bez opcji kompilatora, który określa biblioteka uruchomieniowa C, program łączący użyje LIBCMT.LIB.To różni się od poprzednich wersji programu Visual C++, który używany LIBC.Biblioteka, biblioteka jednowątkowe zamiast.
Za pomocą statycznie CRT pociąga za sobą żadnych informacji o stanie zapisane przez biblioteki c runtime będzie lokalnego wystąpienia CRT.Na przykład, jeśli korzystasz z strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l podczas korzystania z CRT statycznie, położenie strtok parser jest niezwiązanych z strtok stan używany w kodzie w tym samym procesie (ale w innej bibliotece DLL lub EXE), połączonej z inną instancję statyczne CRT.Natomiast CRT dynamicznie połączone udziały Państwa dla całego kodu w proces, który dynamicznie połączone z CRT.Dotyczą tego nie stosuje się, jeżeli za pomocą nowych wersji bezpieczniejsze tych funkcji; na przykład strtok_s ten problem nie występuje.
Ponieważ biblioteki DLL, zbudowany przez połączenie CRT statycznych będą miały stanu CRT, nie zaleca się połączyć statycznie CRT w bibliotece DLL, chyba że konsekwencje tego szczególnie pożądane i zrozumienie.Na przykład, jeśli wywołana _set_se_translator w pliku wykonywalnym ładunków DLL połączone z własnych statyczne CRT, wyjątki sprzętowe wygenerowany przez kod w bibliotece DLL nie zostanie przechwycony przez translator, ale wyjątki sprzętowe wygenerowany przez kod w głównym pliku wykonywalnego, który zostanie przechwycony.
Jeśli używasz /clr przełącznik kompilatora, kod zostanie połączony z biblioteka statyczna, łączona.Biblioteka statyczna stanowi proxy między kodu zarządzanego i CRT macierzystym.Nie można używać statycznie CRT ( /MT lub /MTd opcje) z /clr.Użyj połączone dynamicznie bibliotek (/MD lub /MDd) zamiast.
Jeśli używasz /clr:pure przełącznik kompilatora, kod zostanie połączony z wersji produkcyjnej biblioteka statyczna.Tak jak w /clr, nie można połączyć się z biblioteką statycznie.
Aby uzyskać więcej informacji na temat używania CRT z /clr, zobacz Mieszane (macierzystych i zarządzanych); for /clr:pure, see Kod czystej i zweryfikowania (C + +/ CLI).
Aby utworzyć wersję debugowania aplikacji, _DEBUG musi być określona flaga i aplikacji musi być powiązana z wersją programu debug jednego z tych bibliotek.Aby uzyskać więcej informacji na temat korzystania z wersji debugowania plików biblioteki, zobacz Techniki debugowania CRT.
Ta wersja Visual C++ nie jest zgodna z normą C99.
Standardowa biblioteka języka C++
Standardowa biblioteka języka C++ |
Właściwości |
Opcja |
Dyrektywy preprocesora |
---|---|---|---|
LIBCPMT.LIB |
Łącze wielowątkowe, statyczne |
/MT |
_MT |
MSVCPRT.LIB |
Wielowątkowe, dynamic link (Importuj biblioteki MSVCP110.dll) |
/MD |
_MT, _DLL |
LIBCPMTD.LIB |
Łącze wielowątkowe, statyczne |
/MTd |
_DEBUG, _MT |
MSVCPRTD.LIB |
Wielowątkowe, dynamic link (Importuj biblioteki MSVCP110D.BIBLIOTEKA DLL) |
/MDd |
_DEBUG, _MT, _DLL |
Uwaga LIBCP.LIB i LIBCPD.LIB (za pomocą starego /ML i /MLd opcje) zostały usunięte.Za pomocą LIBCPMT.LIB i LIBCPMTD.Zamiast LIB via /MT i /MTd opcje.
Podczas tworzenia wersji projektu, w jednym z podstawowych biblioteki uruchomieniowej C (LIBCMT.BIBLIOTEKA, MSVCMRT.BIBLIOTEKA, MSVCRT.Jest domyślnie połączony LIB), w zależności od opcji kompilatora wybrać (wielowątkowe, biblioteka DLL/CLR).Jeśli zawiera jeden z Pliki nagłówków w kodzie, standardowa biblioteka języka C++ będzie połączony w automatycznie przez Visual C++ w czasie kompilacji.Na przykład:
#include <ios>
Jaka jest różnica między msvcrt.dll i msvcr110.dll?
"Znany DLL," oznacza, że jest składnikiem systemu własnością i są wbudowane w system Windows jest teraz msvcrt.dll.Jest przeznaczony do wykorzystania w przyszłości tylko przez składniki na poziomie systemu.
Jakie problemy istnieć, jeśli aplikacja używa zarówno msvcrt.dll i msvcr110.dll?
Jeśli plik .lib lub .obj, który musi połączyć się z msvcrt.lib, następnie powinna nie trzeba ponownie skompilować go do pracy z nowych msvcrt.lib w programie Visual C++.Plik .lib lub .obj może polegać na rozmiary, przesunięcia pola lub nazwy funkcji składników różnych klas CRT lub zmiennych, i tych, należy wszystkie nadal występują w sposób zgodny.Przy ponownym łączeniu przeciwko msvcrt.lib obrazie końcowym EXE i DLL będzie teraz ma zależności msvcr110.dll zamiast msvcrt.dll.
Jeśli masz więcej niż jeden DLL lub EXE, a następnie może mieć więcej niż jeden CRT, niezależnie od tego, czy są przy użyciu różnych wersji Visual C++.Na przykład statycznie łączenie CRT do wielu bibliotek DLL może przedstawić ten sam problem.Ten problem z statyczne im monitory CRT deweloperzy których uzyskał skompilować z /MD biblioteki DLL CRT.Teraz, że biblioteka DLL CRT została zmieniona na msvcr110.dll, aplikacje mogą mieć niektóre składniki połączony msvcrt.dll i innych msvcr110.dll.Jeśli biblioteki DLL zasobów CRT granice msvcrt.dll i msvcr110.dll, będą występować problemy z niedopasowane im monitory CRT i konieczne do ponownego kompilowania projektu Visual C++.
Jeśli program korzysta z więcej niż jedną wersję CRT, niektóre opieki granicami DLL jest potrzebne podczas przekazywania niektórych obiektów CRT (takich jak dojścia do plików, ustawień regionalnych i zmiennych środowiskowych).Więcej informacji na temat kwestii i sposób ich rozwiązania, zobacz Potencjalnych błędów, przekazując obiektów CRT granicami DLL.