我有一段时间没有接触 C++,这个问题可能很愚蠢,但它确实困扰了我一段时间。

假设我有以下 c 程序:

#include <stdio.h>

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

我知道我包含 stdio.h 的原因是因为我在 printf 中调用了 main 但我想知道编译器如何知道在编译期间在哪里可以找到 printf() 的实现? stdio.h 只提供函数原型(prototype),但编译过程中到底发生了什么?

是否有编译器知道的特定前缀路径来搜索 printf 的实现?如果有,如何找到它们?

非常感谢!

最佳答案

如果您使用的是 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)

您可以通过在您自己的 C 库中传递 libc 和 link 来禁用 -nostdlib 的链接。还有其他方法可以替换 C 库提供的定义,例如在您自己的 malloc 中链接等等。链接器只能为任何给定的声明找到一个定义,并且由于 C 中没有名称修饰,因此很容易做到这一点。

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

关于c++ - 编译器在哪里找到 `` printf``?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37153864/

10-11 23:22
查看更多