可执行文件生成过程和gcc参数介绍
文章结构
可执行文件生成过程
对于一个源文件test.c生成可执行文件test.out的过程如下:
1. 预处理器
输入文件:test.c
执行命令:gcc -E test.c -o test.i
功能:展开头文件、去掉注释、宏替换
输出文件:test.i
2. 编译器
输入文件:test.i
执行命令:gcc -S test.i -o test.s
功能:语法检查、代码优化处理、生成汇编文件
输出文件:test.s
3. 汇编器
输入文件:test.s
执行命令:gcc -c test.s -o test.o
功能:将汇编代码翻译成目标机器指令生成二进制文件
输出文件:test.o
4. 链接器
输入文件:test.o
执行命令:gcc test.o -o test.out
功能:将函数库中用到的代码整合到目标文件中生成可执行文件;
连接类型:一种是静态链接,他会将程序会用到的库一次性全部连接到一个目标文件里面,优点是速度快,但目标文件太大;另一种是动态链接,它则是用到那个库才去动态的连接,优点是目标文件小,但速度不及静态链接。
输出文件:test.out
gcc参数用法
语法
gcc语法:
- gcc 多个参数 输入文件,如:gcc -o test.exe test.c
- gcc 输入文件 多个参数,如:gcc test.c -o test.exe
- gcc 多个输入文件 多个参数,如:gcc a.c b.c c.c -I head -g
- gcc 多个参数 多个输入文件,如:gcc -I head -g a.c b.c c.c
参数
- 查看版本号:gcc -v/--version
- 产生目标文件并命名:-o
- 命令:gcc test.c -o test.exe
- 作用:生成可执行文件并对其重命名
- 指定头文件目录:-I(大写i) + 目录
- 命令:gcc test.c -I 头文件所在目录 -o test.exe
- 作用:自顶自定义头文件路径
- 编译时定义宏:-D + 宏定义名
- 命令:gcc test.c -D 宏名 -o test.exe
- 作用:打印调试信息,如果不在文件中#define 定义的化默认是不会打印调试信息的,如果你需打印的话这就需要加-D参数
- 编译优化:-On (n = 0 ~ 3; -O0:没有优化; -O1:缺省值;-O2:优化级别最高)
- 命令:gcc test.c -O1 -o test.exe
- 作用:优化冗余代码,比如:int a = 10, b=a,c=b,d=c; 则可直接有为d = a;
- 显示提示信息: -Wall
- 命令:gcc test.c -Wall -o test.ext
- 作用:如果有警告信息会提示,比如某个变量没有使用
- 生成预处理文件:-E
- 命令:gcc -E test.c -o test.i
- 作用:上面已经说过了
- 只编译子程序:-c
- 命令:gcc -c test.c -o test.o
- 作用:在用静态库和动态库是常用来生成 .o 文件
- 包含调试信息:-g(gdb调试的时候必须加改参数)
- 命令:gcc test.c -g -o test.ext
- 作用:当需要调试程序的时候必须加-g,如果是程序发布的话则不用加,加-g参数会使得文件变大