2010-07-08 1 views
3

abs(), cout 스트림, printf 등의 모든 함수/정의를 포함하는 표준 C 라이브러리에 대해 궁금합니다.표준 물건을위한 라이브러리 (예 : cout 등) * NEWBIE 질문 * :)

헤더 파일 (stdio.h, cmath.h, time.h 등)에 익숙하지만 어디서나 .lib 또는 .dll 파일이없는 것 같습니다 (예 : stdio.lib, time). DLL 등).

이 헤더 파일에있는 함수의 실제 코드는 어디에 있습니까? 내가 뭔가를 오해하고 있니? 거기에, 모든 표준화 된 물건을 포함하는 하나의 거대한 lib 파일, 또는 각 헤더에 대한 하나입니까?

감사합니다.

감사합니다.

+5

C 표준 라이브러리에는'cout'이나 스트림이 없습니다. –

답변

4

구현에 따라 다릅니다. Windows에서 표준 라이브러리 기능은 the C and C++ runtime libraries입니다. C 런타임 라이브러리는 항상 자동으로 링크됩니다. 표준 라이브러리 헤더 중 하나를 포함하면 C++ 런타임 라이브러리가 자동으로 링크됩니다.

0

DLL을 언급하면 ​​Windows를 사용하고 있다고 가정합니다. 이 경우 일반적으로 컴파일러와 함께 제공되는 하나의 "런타임"DLL이 있습니다. Visual C++에서는 이름이 msvcrt.dll 또는 유사하다고 생각합니다.

+0

프로그램에서 둘 이상의 dll을 사용할 수 있습니다. 이름은 msvcr **. dll, msvcp **. dll입니다. 나는. msvcr80.dll, msvcr90.dll 등. – SigTerm

2

일반적으로 C 또는 C++ 런타임 라이브러리를 명시 적으로 링크 할 필요는 없습니다. 일반적으로 컴파일러는 링커를 올바른 옵션으로 호출하여 사용자를 대신합니다.

는 사실, GCC, 당신은 하지 (예 : -nodefaultlibs, -nostdlib 또는 -nostartfiles을 사용하는 등) 기본 라이브러리를 포함에 뭔가를해야합니다.

표준 라이브러리의 실제 위치 (단일 파일인지 여부 포함)는 구현 문제입니다.

+1

libgcc는 표준 라이브러리가 아닙니다. gcc가 긴 나눗셈 등을 위해 사용하는 내부 구현 코드입니다. 표준 라이브러리는 일반적으로 libc라고합니다. –

3

Linux/UNIX/AIX의 일부 변형 된 경우 ldd를 사용해보십시오. 리눅스 프롬프트에서 ldd`which ls`에 새로운 것을 시도하는 재미를 위해서. 다음은 내가 가지고있는 것입니다 :

librt.so.1 => /lib/tls/librt.so.1 (0x0084c000) 
libacl.so.1 => /lib/libacl.so.1 (0x40022000) 
libselinux.so.1 => /lib/libselinux.so.1 (0x00289000) 
libc.so.6 => /lib/tls/libc.so.6 (0x00a0b000) 
libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00c57000) 
/lib/ld-linux.so.2 (0x009ec000) 
libattr.so.1 => /lib/libattr.so.1 (0x40028000) 

경로는 공유 라이브러리의 위치를 ​​알려줍니다. Windows를 사용하는 경우 depends.exe를받습니다. http://www.dependencywalker.com - 우수한 도구

1

Arpan이 언급했듯이 ldd ('binutils'패키지에 있음)를 사용하여 실제로 사용되는 SO 파일을 찾을 수 있습니다 libc. 리눅스 시스템에서 가장 일반적인 구현은 보통 glibc라고하는 GNU C library입니다.