关于GCC编译:预处理(cpp)与链接(ld)处理库的疑问确认
GCC预处理与链接的职责确认
你的理解基本正确,再补充些细节让逻辑更清晰:
- 预处理阶段(执行
cpp工具):把.c文件处理成.i文件时,只是将#include <stdio.h>这类头文件的内容直接插入到.i文件中。而头文件里仅包含函数声明、宏定义、类型定义(比如printf()的声明int printf(const char *format, ...);),完全不会包含库函数的实际实现代码。 - 链接阶段(执行
ld工具):编译器先把.i文件编译成目标文件(.o)后,链接器会找到对应库(比如标准C库libc.so或libc.a)中printf()这类函数的实际实现代码,将其与你的目标文件合并,最终生成可执行文件(如a.out)。
额外说明:如果使用静态链接(编译时加-static参数),链接器会把程序用到的库代码直接拷贝进a.out;如果是默认的动态链接,不会把库代码完整放入可执行文件,只会记录需要调用的库函数位置,等程序运行时再加载对应的动态库文件。
内容的提问来源于stack exchange,提问作者DLR
相关产品推荐
相关产品推荐

