如果已经在 `stdio.h` 中定义了 `printf.o`,为什么还需要 link?

Why is there a need to link with `printf.o` if it's already defined inside `stdio.h`?

据我所知,当我们包含 stdio.h 时,整个文件将被复制到我们程序的文本中。(基本上我们将其添加到前面)然后当我们为 printf() 执行函数调用时,为什么必须先链接吗?

是不是 stdio.h 只包含那些函数的定义,编译器会为我们调用的函数找到编译后的可执行目标文件,例如 printf().

我在几个地方读到过这个,但还是不太清楚。

像stdio.h这样的头文件通常只包含一个定义函数名称、参数类型和return值的声明。这足以让编译器生成对函数的调用,但它不是定义。实现该功能的实际代码将在库中(扩展名为 .a.o.lib)。

没有。 printf() 包含在 libc.so 中(这是 printf() 函数所在的位置),这是 C 标准库。编译器在调用 link 时自动包含 -lc 作为选项,因此您无需添加该选项。仅当您 link 您的目标文件直接调用 link 或 ld 时,您才需要自己包含该选项(以及其他一些构成 C 运行时的文件, linker 不知道您正在 link 编写 C 源程序,因此它不知道您的模块要 link 哪些文件,但编译器知道)请参阅文档您使用的编译器,或者在构建可执行文件时仅使用 -v 选项,以查看编译器用于调用 linker 的命令行,您将看到编译器需要的所有对象和库每个 C 程序。