【发布时间】:2019-01-21 16:20:34
【问题描述】:
我最近阅读了CSAPP,对其中的编译系统部分有一些疑问。
现在我们有一个使用 HelloWorld.c 的示例(只需打印 hello world)。书中说在预处理器阶段,他们用这个头文件的内容替换了“#include”行。但是当我打开stdio.h时,发现里面只有一个printf()的声明,并没有具体的实现。那么在编译系统中,什么时候会引入printf()的具体实现呢?
这本书还说,在链接阶段,链接器(ld)链接了 helloworld.o 和 printf.o 。为什么链接器知道将我的目标文件链接到 printf.o?在编译系统中,为什么在第一步(预处理阶段)声明这个函数,在最后一步(链接阶段)链接具体实现?
【问题讨论】:
-
printf是标准库的一部分,始终链接(除非另有说明) -
链接器默认链接一些库,例如
libc.so和libdl.so
标签: c++ c compiler-construction