3

我想知道包含所有函数/定义(如 abs()、cout 流、printf 等)的标准 C 库。

我熟悉头文件(stdio.h、cmath.h、time.h 等),但似乎没有任何对应的 .lib 或 .dll 任何地方(即 stdio.lib、time.dll , ETC)。

这些头文件中函数的实际代码在哪里?我是不是误会了什么?是否有一个包含所有标准化内容的巨大 lib 文件,或者每个头文件都有一个?

任何帮助表示赞赏!

谢谢!

4

5 回答 5

4

这取决于实施。在 Windows 上,标准库功能位于C 和 C++ 运行时库中。C 运行时库始终自动链接;如果您包含标准库头文件之一,则 C++ 运行时库会自动链接。

于 2010-07-08T04:46:48.733 回答
3

如果您使用的是 Linux/UNIX/AIX 的某些变体,请尝试使用 ldd 。只是为了在 Linux 提示符中尝试新类型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 -- 优秀的工具

于 2010-07-08T04:58:48.967 回答
2

您通常不必显式链接 C 或 C++ 运行时库。通常编译器会使用正确的选项调用链接器来为您执行此操作。

实际上,使用 gcc,您必须做一些事情以包含默认库(例如 using-nodefaultlibs或 )。-nostdlib-nostartfiles

标准库的实际位置,包括它是否在单个文件中,是一个实现问题。

于 2010-07-08T04:46:59.607 回答
1

正如 Arpan 提到的,您可以使用 ldd(位于“binutils”包中)来发现实际用于 libc 的 SO 文件。Linux 系统上最常见的实现是GNU C 库,通常称为 glibc。

于 2010-07-08T07:54:52.743 回答
0

如果您提到 DLL,我假设您使用的是 Windows。在这种情况下,编译器通常附带一个“运行时”DLL。对于 Visual C++,我相信名称是 msvcrt.dll 或类似名称。

于 2010-07-08T04:46:56.997 回答