Tak, libcmt jest (jedną z kilku) implementacją standardowej biblioteki C dostarczonej z kompilatorem Microsoftu. Udostępniają wersje „debugowania” i „wydania” trzech podstawowych typów bibliotek: jednowątkowych (zawsze połączonych statycznie), wielowątkowych połączonych statycznie i wielowątkowych połączonych dynamicznie (chociaż w zależności od wersji kompilatora, przy użyciu, niektóre z nich mogą nie być obecne).
Tak więc w nazwie „libcmt” „libc” jest (mniej lub bardziej) tradycyjną nazwą biblioteki C. „Mt” oznacza „wielowątkowy”. Wersja "debugująca" miałaby na końcu "d", co daje "libcmtd".
Jeśli chodzi o funkcje, które zawiera, standard C (część 7, jeśli Ci zależy) definiuje zestaw funkcji, które musi dostarczyć zgodna (hostowana) implementacja. Większość dostawców (w tym Microsoft) samodzielnie dodaje różne inne funkcje (ze względu na kompatybilność, w celu zapewnienia możliwości, których standardowe funkcje nie uwzględniają itp.) W większości przypadków będzie zawierał również kilka funkcji „wewnętrznych” używanych przez kompilator ale zwykle nie przez użytkownika końcowego.
Jeśli chcesz uzyskać pełną listę funkcji w „libcmt” (na przykład), możesz otworzyć jeden z monitów poleceń programu Visual Studio (zwykle w sekcji „Narzędzia programu Visual Studio”), przełącz się do katalogu, w którym znajdowały się Twoje biblioteki zainstalowane i wpisz coś w rodzaju: lib -list libcmt.lib
a wygeneruje ( długą ) listę nazw wszystkich plików obiektowych w tej bibliotece. Nie zawsze odpowiadają one bezpośrednio nazwom funkcji, ale generalnie dają pomysł. Jeśli chcesz przejrzeć określony plik obiektowy, możesz użyć lib -extract
do wyodrębnienia jednego z tych plików obiektowych, a następnie użyć, dumpbin /symbols <object file name>
aby znaleźć funkcje, które są w tym konkretnym pliku obiektowym.
strcpy
funkcja ze standardowej biblioteki C, na przykład, miałaby swoją implementację w bibliotece wykonawczej, czy po prostu miałaby swój kod w zwykłych plikach .c?Na początku powinniśmy zrozumieć, czym jest biblioteka uruchomieniowa; i zastanów się, co to może oznaczać przez „Microsoft C Runtime Library”.
patrz: http://en.wikipedia.org/wiki/Runtime_library
Opublikowałem tutaj większość artykułu, ponieważ może on zostać zaktualizowany.
źródło
Właśnie o to zapytałem i przez kilka godzin raniłem mózg. Nadal nie znalazłem niczego, co naprawdę ma rację. Każdy, kto coś pisze na jakiś temat, nie jest w stanie tak naprawdę „uczyć”. Jeśli chcesz kogoś uczyć, weź najbardziej podstawowy język, który dana osoba rozumie, aby nie musiał przejmować się innymi tematami podczas prowadzenia tematu. Więc doszedłem do wniosku, który wydaje się dobrze pasować do całego tego chaosu.
W języku programowania C każdy program zaczyna się od funkcji main (). Inne języki mogą definiować inne funkcje, w których program jest uruchamiany. Ale procesor nie zna main (). Procesor zna tylko predefiniowane polecenia, reprezentowane przez kombinacje „0” i „1”.
W programowaniu mikroprocesorowym, który nie ma podstawowego systemu operacyjnego (Microsoft Windows, Linux, MacOS, ...), musisz wyraźnie powiedzieć procesorowi, od czego zacząć, ustawiając ProgrammCounter (PC), który iteruje i skacze (pętle, wywołania funkcji) w polecenia znane procesorowi. Musisz wiedzieć, jak duża jest pamięć RAM, musisz ustawić pozycję stosu programu (zmienne lokalne), a także pozycję sterty (zmienne dynamiczne) i lokalizację zmiennych globalnych (chyba nazywało się to SSA ?) w pamięci RAM. Pojedynczy procesor może wykonywać tylko jeden program na raz.
W tym miejscu pojawia się system operacyjny. Sam system operacyjny jest programem działającym na procesorze. Program umożliwiający wykonanie kodu niestandardowego. Uruchamia wiele programów jednocześnie, przełączając się między kodami wykonywania programów (które są ładowane do pamięci RAM). Ale system operacyjny JEST PROGRAMEM, każdy program jest napisany inaczej. Samo umieszczenie kodu programu niestandardowego w pamięci RAM go nie uruchomi, system operacyjny o tym nie wie. Musisz wywołać funkcje w systemie operacyjnym, który rejestruje twój program, powiedzieć systemowi operacyjnemu, ile pamięci potrzebuje program, gdzie znajduje się punkt wejścia do programu (funkcja main () w przypadku C). Wydaje mi się, że to właśnie znajduje się w RuntimeLibrary i wyjaśnia, dlaczego potrzebujesz specjalnej biblioteki dla każdego systemu operacyjnego,
To wyjaśnia również, dlaczego NIE jest on dynamicznie łączony w czasie wykonywania, tak jak pliki .dll, nawet jeśli nosi nazwę RUNTIMELibrary. Biblioteka RuntimeLibrary musi być połączona statycznie, ponieważ jest potrzebna podczas uruchamiania programu. RuntimeLibrary wstrzykuje / łączy Twój program niestandardowy do / z innym programem (systemem operacyjnym) w RUNTIME. To naprawdę powoduje, że mózg ...
Wniosek: RUNTIMELibrary nie powiodła się w nazewnictwie. Być może we wczesnych czasach nie było .dll (linkowanie w czasie wykonywania), a problem zrozumienia różnicy po prostu nie istniał. Ale nawet jeśli to prawda, nazwa jest źle wybrana.
Lepszymi nazwami dla RuntimeLibrary mogłyby być: StartupLibrary / OSEntryLibrary / SystemConnectLibrary / OSConnectLibrary
Mam nadzieję, że dobrze zrozumiałem, czekam na poprawki / okrzyki rozszerzeń.
źródło
C jest językiem i zgodnie z jego definicją nie muszą być dostępne żadne funkcje. Bez IO, bez procedur matematycznych i tak dalej. Zgodnie z konwencją, istnieje zestaw procedur, które możesz połączyć ze swoim plikiem wykonywalnym, ale nie musisz ich używać. Jest to jednak tak powszechna czynność, że większość konsolidatorów nie prosi już o linkowanie do bibliotek C runtime.
Są chwile, kiedy ich nie chcesz - na przykład podczas pracy z systemami wbudowanymi posiadanie malloc może być niepraktyczne. Kiedyś pracowałem nad osadzaniem PostScript w drukarkach i mieliśmy własny zestaw bibliotek wykonawczych, które były dużo szczęśliwsze w systemach wbudowanych, więc nie zawracaliśmy sobie głowy „standardem”.
źródło
Biblioteka wykonawcza to biblioteka, która jest automatycznie kompilowana dla każdego uruchamianego programu w C. Wersja biblioteki, której użyjesz, zależy od kompilatora, platformy, opcji debugowania i opcji wielowątkowości.
Dobry opis różnych opcji dostępnych w bibliotekach wykonawczych: http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html
Zawiera funkcje, o których normalnie nie myślisz, że wymagają biblioteki do wywołania:
Microsoft ma ładną listę swoich funkcji biblioteki wykonawczej:
http://msdn.microsoft.com/en-us/library/2aza74he(VS.71).aspx
Dokładna lista funkcji będzie się różnić w zależności od kompilatora, więc w przypadku iOS można uzyskać inne funkcje, takie jak dispatch_async () lub NSLog ().
źródło
Jeśli używasz narzędzia takiego jak Dependency Walker na pliku wykonywalnym skompilowanym z C lub C ++, zobaczysz, że jedna z bibliotek DLL, od których jest zależny, to MSVCRT.DLL. To jest biblioteka Microsoft C Runtime Library. Jeśli przyjrzysz się dokładniej plikowi MSVCRT.DLL za pomocą DW, zobaczysz, że są tam wszystkie funkcje, takie jak printf (), puts (0, gets (), atoi () itp.
źródło
myślę, że definicja Microsoftu naprawdę oznacza:
źródło
Istnieją trzy formy biblioteki wykonawczej języka C dostarczanej z zestawem Win32 SDK:
32-bitowa edycja Microsoft Visual C ++ zawiera również te trzy formy, jednak CRT w bibliotece DLL nosi nazwę MSVCRT.LIB. Biblioteka DLL podlega redystrybucji. Jego nazwa zależy od wersji VC ++ (np. MSVCRT10.DLL lub MSVCRT20.DLL). Należy jednak pamiętać, że MSVCRT10.DLL nie jest obsługiwany na Win32s, podczas gdy CRTDLL.LIB jest obsługiwany na Win32s. MSVCRT20.DLL jest dostępny w dwóch wersjach: jednej dla Windows NT i drugiej dla Win32.
zobacz: http://support.microsoft.com/?scid=kb%3Ben-us%3B94248&x=12&y=9
źródło