C 런타임 라이브러리 란 무엇입니까?


157

실제로 C 런타임 라이브러리 란 무엇이며 어떤 용도로 사용됩니까? 나는 악마처럼 인터넷 검색을했지만 마이크로 소프트보다 더 좋은 것을 찾을 수 없었다. "Microsoft 런타임 라이브러리는 Microsoft Windows 운영 체제를위한 프로그래밍 루틴을 제공합니다. "C 및 C ++ 언어."

좋아, 나는 그것을 얻지 만, 예를 들어, 무엇에 libcmt.lib있습니까? 무엇을합니까? C 표준 라이브러리는 C 컴파일러의 일부라고 생각했습니다. 그렇다면 libcmt.libWindows의 C 표준 라이브러리 함수 구현이 win32에서 작동합니까?

답변:


71

예, libcmt는 Microsoft 컴파일러와 함께 제공되는 C 표준 라이브러리의 구현입니다 (여러 중 하나). 이 라이브러리는 단일 스레드 (항상 정적으로 링크 됨), 다중 스레드 정적 링크다중 스레드 동적 링크 (컴파일러 버전에 따라 다름 ) 의 세 가지 기본 유형 라이브러리의 "디버그"및 "릴리스"버전을 모두 제공합니다. 사용 중 일부는 존재하지 않을 수 있습니다).

따라서 "libcmt"라는 이름에서 "libc"는 C 라이브러리의 전통적인 이름입니다. "mt"는 "멀티 스레드"를 의미합니다. "디버그"버전의 끝에 "d"가 추가되어 "libcmtd"가 제공됩니다.

어떤 기능이 포함되어 있는지에 따라 C 표준 (7 부, 관리가 필요한 경우)은 적합한 (호스트 된) 구현이 제공해야하는 기능 세트를 정의합니다. 대부분의 공급 업체 (Microsoft 포함)는 다양한 다른 기능을 자체적으로 추가합니다 (호환성을 위해 표준 기능이 해결하지 않는 기능을 제공하는 등). 대부분의 경우 컴파일러에서 사용하는 상당히 많은 "내부"기능도 포함합니다. 그러나 일반적으로 최종 사용자가 아닙니다.

"libcmt"(예제를 사용하기 위해)의 전체 기능 목록을 얻으려면 Visual Studio 명령 프롬프트 중 하나 (일반적으로 "Visual Studio Tools"에서)를 열고 라이브러리가있는 디렉토리로 전환하십시오. 설치하고 다음과 같이 입력 하면 해당 라이브러리에있는 모든 객체 파일의 이름이 lib -list libcmt.lib( long ) 목록으로 생성됩니다 . 그것들이 항상 함수의 이름과 직접적 으로 일치하는 것은 아니지만 일반적으로 아이디어를 줄 것입니다. 특정 객체 파일 을 보려면 lib -extract해당 객체 파일 중 하나를 추출한 다음 해당 객체 파일에 dumpbin /symbols <object file name>있는 기능을 찾는 데 사용할 수 있습니다.


37
"C 런타임 라이브러리"가 무엇인지 말하지 않았습니다!
onmyway133

4
@entropy : 물론 내가했던 것처럼 보이지만 짧은 대답은 함수의 모음이며, C 표준의 7 부에서 많은 (그러나 반드시 전부는 아님) 함수라는 것입니다.
Jerry Coffin

3
이 답변은 C 라이브러리가 컴파일러 툴체인의 일부라는 것을 의미합니다. 정확하지 않습니다.
jiggunjer

@JerryCoffin 질문 : strcpy예를 들어 C 표준 라이브러리 의 함수가 런타임 라이브러리에서 구현되었거나 일반 .c 파일의 코드입니까?
forumulator

@forumulator : 일반적으로 표준 라이브러리 (..dll, lib, .a, .so 또는 사용중인 시스템에 적용되는 모든 것)를 생성하기 위해 컴파일되는 .c 파일에 소스 코드가 있습니다. .
Jerry Coffin

56

처음에는 런타임 라이브러리가 무엇인지 이해해야합니다. "Microsoft C Runtime Library"가 무엇을 의미하는지 생각해보십시오.

참조 : http://en.wikipedia.org/wiki/Runtime_library

나는 기사가 업데이트 될 수 있기 때문에 대부분의 기사를 여기에 게시했습니다.

컴퓨터 프로그램의 소스 코드가 컴파일러에 의해 각각의 대상 언어로 번역 될 때, 프로그램의 각 명령과 내장 함수에 대한 모든 호출로 인해 내부 생성이 발생하면 프로그램 코드가 크게 확대됩니다 매번 대상 언어로 된 해당 프로그램 코드의 전체 대신 컴파일러는 종종 응용 프로그램 프로그래머가 액세스 할 수없는 런타임 라이브러리의 컴파일러 특정 보조 기능을 사용합니다. 컴파일러 제조업체에 따라 런타임 라이브러리는 때때로 해당 컴파일러의 표준 라이브러리를 포함하거나 포함 할 수도 있습니다.

또한 런타임시에만 수행 할 수있는 (또는보다 효율적이거나 정확한) 일부 기능 (예 : 일부 논리 오류, 배열 범위 검사, 동적 유형 검사, 예외 처리 및 가능한 디버깅 기능)이 런타임 라이브러리에서 구현됩니다. 이러한 이유로 복잡한 컴파일 타임 확인 및 시험판 테스트에도 불구하고 실제 데이터가있는 "실시간"환경에서 프로그램을 테스트 할 때까지 일부 프로그래밍 버그가 발견되지 않습니다. 이 경우 최종 사용자에게 런타임 오류 메시지가 표시 될 수 있습니다.

일반적으로 런타임 라이브러리는 운영 체제에 액세스하여 많은 기능을 실현합니다. 많은 프로그래밍 언어에는 내장 함수가있어 컴파일러에서 반드시 구현할 필요는 없지만 런타임 라이브러리에서 구현할 수 있습니다. 따라서 런타임 라이브러리와 표준 라이브러리의 경계는 컴파일러 제조업체에 달려 있습니다. 따라서 런타임 라이브러리는 항상 컴파일러 및 플랫폼마다 다릅니다.

런타임 라이브러리의 개념은 응용 프로그램 프로그래머가 작성하거나 타사 또는 동적 라이브러리에서 제공하는 것과 같은 일반 프로그램 라이브러리와 혼동되어서는 안됩니다. 즉, 런타임시 링크 된 프로그램 라이브러리를 의미합니다. 예를 들어 프로그래밍 언어 C에는 최소 런타임 라이브러리 (일반적으로 crt0이라고 함) 만 필요하지만 각 구현에서 제공해야하는 큰 표준 라이브러리 (C 표준 라이브러리라고 함)를 정의합니다.


3
표준 라이브러리와 구별되는 방법으로 강조 표시된 문장은 "가장"또는 "때때로"자격이없는 것으로 처음 본 간결한 정확한 답변입니다.
nik.shornikov

@ nik.shornikov : 다른 설명이 더 정확 해지기 때문입니다. 표준 라이브러리가 일반적으로 컴파일러 및 플랫폼에 고유 한 것이 사실이지만 항상 그런 것은 아닙니다. 예를 들어 Windows 용 Mingw 및 Intel C ++ 컴파일러의 일부 버전은 Microsoft의 표준 라이브러리를 사용하지 않고 자체 표준을 사용했습니다. 마찬가지로 Linux의 Clang은 다른 gcc 자체를 설치하지 않고 기존 gcc 설치에서 표준 라이브러리를 사용하도록 설치 될 수 있습니다.
Jerry Coffin

POSIX를 지원하는 모든 플랫폼에 이식 가능한 C 및 C ++ 표준 라이브러리의 구현을 작성할 수 있다고 확신합니다.
Jerry Coffin

20

방금이 질문을하고 몇 시간 동안 뇌를 아프게했습니다. 여전히 현실적으로 지적한 것은 아무것도 찾지 못했습니다. 어떤 주제에 무언가를 쓰는 사람은 실제로 "교사"를 할 수 없습니다. 누군가에게 가르치고 싶다면, 사람들이 이해하는 가장 기본적인 언어를 사용하므로 주제를 다룰 때 다른 주제에 신경 쓸 필요가 없습니다. 그래서 나는이 모든 혼란에 잘 맞는 것처럼 스스로 결론을 내 렸습니다.

프로그래밍 언어 C에서 모든 프로그램은 main () 함수로 시작합니다. 다른 언어는 프로그램이 시작되는 다른 기능을 정의 할 수 있습니다. 그러나 프로세서는 main ()을 모른다. 프로세서는 "0"과 "1"의 조합으로 표시되는 사전 정의 된 명령 만 알고 있습니다.

기본 운영 체제 (Microsoft Windows, Linux, MacOS, ..)가없는 마이크로 프로세서 프로그래밍에서 반복 및 점프 (루프, 함수 호출)하는 ProgrammCounter (PC)를 설정하여 프로세서가 시작할 위치를 명시 적으로 알려야합니다. 프로세서에 알려진 명령. RAM의 크기를 알아야합니다. 프로그램 스택의 위치 (로컬 변수)를 설정해야하며 힙의 위치 (동적 변수)와 전역 변수의 위치 (즉, SSA라고합니다) RAM 내에서). 단일 프로세서는 한 번에 하나의 프로그램 만 실행할 수 있습니다.

운영 체제가 시작됩니다. 운영 체제 자체는 프로세서에서 실행되는 프로그램입니다. 사용자 지정 코드를 실행할 수있는 프로그램입니다. RAM에로드 된 프로그램의 실행 코드 사이를 전환하여 한 번에 여러 프로그램을 실행합니다. 그러나 운영 체제는 프로그램이며 각 프로그램은 다르게 작성됩니다. 사용자 정의 프로그램의 코드를 RAM에 넣는 것만으로는 실행되지 않으며 운영 체제는이를 알지 못합니다. 프로그램을 등록하는 운영 체제에서 함수를 호출하고, 프로그램에 필요한 메모리 양, 프로그램의 진입 점이있는 위치 (C의 경우 main () 함수)를 운영 체제에 알려야합니다. 이것이 내가 생각하는 것은 RuntimeLibrary 내에 있으며 각 운영 체제마다 특별한 라이브러리가 필요한 이유를 설명합니다.

RUNTIMELibrary라고하더라도 .dll 파일이 런타임에 동적으로 연결되지 않는 이유도 설명합니다. RuntimeLibrary는 정적으로 링크되어야하며 프로그램 시작시 필요합니다. RuntimeLibrary는 런타임에 사용자 정의 프로그램을 다른 프로그램 (운영 체제)에 삽입 / 연결했습니다. 이 현실은 뇌의 일부를 유발합니다.

결론 : RUNTIMELibrary는 이름 지정에 실패합니다. 초기에 .dll (런타임에 링크)이 없었을 수 있으며 차이를 이해하는 문제는 존재하지 않았습니다. 그러나 이것이 사실이더라도 이름은 잘못 선택되었습니다.

RuntimeLibrary의 더 나은 이름은 StartupLibrary / OSEntryLibrary / SystemConnectLibrary / OSConnectLibrary 일 수 있습니다.

수정 / 확장 응원을 위해 내가 올바르게 이해했으면 좋겠다.


1
나는 여전히 이데 리아를 얻지 못한다. 왜 프로그램이 런타임에 무언가를 필요로 하는가? 런타임에 바이너리 코드를 지원하지 않고 바이너리 코드를 100 % 단독으로 실행할 수없는 이유는 무엇입니까? 또는 다른 말로 : (OS 포함) 아무것도없이 100 % 실행되는 코드를 가질 수 있습니까?
MarcioAB

5
이론적으로 프로그램에는 RTL이 필요 하지 않습니다 . 그러나 프로그램이 운영 체제와의 협조없이 어떻게 결과를 표시하거나 입력 또는 요청 메모리를 사용합니까?
SN

16

C는 언어이며 그 정의에 따라 사용 가능한 기능이 필요하지 않습니다. IO, 수학 루틴 등이 없습니다. 일반적으로 실행 파일에 링크 할 수있는 일련의 루틴이 있지만이 를 사용할 필요 는 없습니다 . 그러나 이것은 대부분의 링커가 더 이상 C 런타임 라이브러리에 링크하도록 요청하지 않는 일반적인 작업입니다.

예를 들어 임베디드 시스템으로 작업 할 때 malloc을 사용하는 것은 실용적이지 않을 수 있습니다. 예전에는 PostScript를 프린터에 임베드하는 작업을했으며 임베디드 시스템에서 훨씬 더 만족스러운 자체 런타임 라이브러리 세트를 가지고 있었기 때문에 "표준"에 신경 쓰지 않았습니다.


11
실제로 C 표준은 "자립형"및 "호스팅 된"이라는 두 가지 유형의 C 환경을 설명하며 호스팅 된 환경에서 표준에 설명 된 기능은 사용 가능한 것으로 정의됩니다. 임베디드 시스템에서 C 환경은 일반적으로 독립형이므로 라이브러리 루틴이 없거나 일부를 사용하지 않고 자신의 대체물을 사용할 수 있습니다.

10

런타임 라이브러리는 실행하는 모든 C 프로그램에 대해 자동으로 컴파일되는 라이브러리입니다. 사용할 라이브러리 버전은 컴파일러, 플랫폼, 디버깅 옵션 및 멀티 스레딩 옵션에 따라 다릅니다.

런타임 라이브러리에 대한 다양한 선택에 대한 자세한 설명 : http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

일반적으로 호출 할 라이브러리가 필요하다고 생각하지 않는 함수가 포함됩니다.

  • Malloc
  • 열거 형, 구조체
  • 복근, 분
  • 주장하다

Microsoft는 런타임 라이브러리 함수 목록을 제공합니다.

http://msdn.microsoft.com/en-us/library/2aza74he(VS.71).aspx

정확한 함수 목록은 컴파일러에 따라 다르므로 iOS의 경우 dispatch_async () 또는 NSLog ()와 같은 다른 함수를 얻을 수 있습니다.


1
struct와 enum은 실제로 런타임 라이브러리입니까?
Dean P

6

C 또는 C ++에서 컴파일 된 실행 파일에서 Dependency Walker 와 같은 도구를 사용하는 경우 종속 DLL 중 하나가 MSVCRT.DLL임을 알 수 있습니다. 이것은 Microsoft C 런타임 라이브러리입니다. DW를 사용하여 MSVCRT.DLL을 추가로 검사하면 printf (), puts (0, gets (), atoi () 등의 모든 기능이 작동하는 곳입니다.


6
해당 실행 파일을 컴파일하는 동안에 만 C 런타임이 동적으로 링크되었습니다. 이 정적으로 링크 된 경우, 종속성 워커 nothiing 표시됩니다
엘리 Bendersky

4

Microsoft의 정의가 실제로 의미하는 것 같습니다.

표준 C 런타임 라이브러리의 Microsoft 구현은 다음을 제공합니다.


3

Win32 SDK와 함께 제공되는 C 런타임 라이브러리에는 세 가지 형태가 있습니다.

* LIBC.LIB is a statically linked library for single-threaded programs.
* LIBCMT.LIB is a statically linked library that supports multithreaded programs.
* CRTDLL.LIB is an import library for CRTDLL.DLL that also supports multithreaded programs. CRTDLL.DLL itself is part of Windows NT. 

Microsoft Visual C ++ 32 비트 버전에는 이러한 세 가지 형식도 포함되어 있지만 DLL의 CRT는 MSVCRT.LIB입니다. DLL은 재배포 가능합니다. 이름은 VC ++ 버전 (예 : MSVCRT10.DLL 또는 MSVCRT20.DLL)에 따라 다릅니다. 그러나 MSVCRT10.DLL은 Win32에서 지원되지 않지만 CRTDLL.LIB는 Win32에서 지원됩니다. MSVCRT20.DLL은 Windows NT 용과 Win32 용의 두 가지 버전으로 제공됩니다.

참조 : http://support.microsoft.com/?scid=kb%3Ben-us%3B94248&x=12&y=9

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.