我有一段时间没有接触 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/