一、编译流程.i文件预编译文件.s文件汇编文件.o文件目标文件Object File.o文件通过链接器等工具处理可以形成不同的最终产物二、各阶段实际做了什么处理预编译命令gcc -E main.c -o main.i工具cppC PreprocessorC预处理器功能删除注释、展开#include文件包含、替换#define宏展开、处理条件编译、添加行号标记编译命令gcc -S main.c -o main.s gcc -S main.i -o main.s工具cc1C Compiler 1GCC 的 C 编译器核心功能词法分析、语法分析、语义分析、中间代码生成、优化、汇编代码生成汇编命令gcc -c main.c -o main.o gcc -c main.s -o main.o工具asGNU AssemblerGNU 汇编器功能助记符翻译、生成符号表、生成重定位表、组织ELF格式三、举例说明3.1、你输入gcc main.c -o may_appgcc内部实际做的事第1步调用cpp -- 预处理第2步调用cc1 -- 编译第3步调用as -- 汇编第4步调用ld -- 链接最后输出my_app3.2、从.o到不同最终产物# 情况A: 生成可执行文件 gcc main.o add.o subtract.o -L./lib -lmath -o my_calculator # 情况B: 生成静态库 ar rcs libmath.a add.o subtract.o multiply.o # 情况C: 生成共享库 gcc -shared -fPIC add.o subtract.o -o libmath.so # 情况D: 生成内核模块 ld -r keyboard_driver.o usb_core.o -o keyboard.ko问题一为什么.c到.o需要经过几个步骤而不是直接从.c到.o问题二静态库和动态库----关于静态库和动态库一言以蔽之静态库是编译时“嵌入”进可执行文件的代码拷贝动态库是运行时“借用”的共享代码。静态库让程序独立但臃肿动态库让程序轻量但依赖环境。