当我编写如下代码时
#include <stdio.h>
int main(int argc, char** argv) {
printf("Hello, world!\n");
return 0;
}
gcc 导入,stdio.h
这又需要一个关联的stdio.c
函数定义位置。我知道在 linux 上stdio.h
位于,/usr/include/stdio.h
但是在哪里stdio.c
?没有/usr/include/stdio.c
,但是,显然,gcc
可以很好地编译此代码。
与大多数库一样,libc 是预先编译的,并作为编译后的库(而不是源代码)随系统一起提供。在 Linux 上,该库将被称为 libc.a(用于静态链接)或 libc.so(用于动态链接),通常可以在 /usr/lib 或其子目录中找到。
另外,请注意,在 C 中,实际上并不要求头文件名与源文件的名称相匹配。例如,glibc 是 libc 最流行的实现之一,它将其 stdio 实现分散在多个文件中(stdio 中的每个函数大约一个 C 文件);这些源文件可以在glibc git 存储库中找到。
当您包含 时
stdio.h
,它会提供函数声明(如printf
),但实际实现已在 C 标准库(例如 glibc)中预编译为二进制文件(如 )libc.so
,位于/lib
或 等目录中/usr/lib
。这些实现写在stdio.c
glibc 源代码中的源文件(例如 )中,默认情况下不会安装,但可以单独下载。在编译期间,gcc
将您的代码链接到此库,因此不需要stdio.c
在您的系统上可见。