编译器在哪里找到``printf``?

xxk*_*kkk 3 c c++

我暂时没有触及c ++,这个问题可能是愚蠢的,但它确实困扰了我一段时间.

假设我有以下c程序:

#include <stdio.h>

int main()
{
  int i;
  for(i=0; i<10; i++)
  {
    printf("Hello World!\n");
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道我包括的原因stdio.h是因为我打电话printfmain,但我想知道编译器怎么会知道在哪里可以找到执行printf()编译过程中?stdio.h只提供函数原型但在编译期间究竟发生了什么?

编译器会知道搜索实现的某些前缀路径printf吗?如果是这样,如何找到它们?

非常感谢!

小智 7

如果您使用的是Linux系统,那么可能就是使用的C库glibc.GCC实际上并不提供C库实现,只提供头文件.实际实现这些函数的定义是C库的工作.在Linux上,有一种称为"共享库"的东西,它们由需要它的程序动态加载.例如:

ldd /usr/bin/gcc
    linux-vdso.so.1 (0x00007ffd9e9f8000)
    libm.so.6 => /lib64/libm.so.6 (0x00007ff9a35a6000)
    libc.so.6 => /lib64/libc.so.6 (0x00007ff9a31de000)
    /lib64/ld-linux-x86-64.so.2 (0x000055953c573000)
Run Code Online (Sandbox Code Playgroud)

您可以libc通过-nostdlib在自己的C库中传递和链接来禁用链接.还有其他方法可以替换C库提供的定义,例如您自己的链接malloc等.链接器只允许为任何给定的声明找到一个定义,因为在C中没有名称重整,所以很容易这样做.

这是一个过于简化的解释,并没有提到内置函数,数学库等.