1.gcc编译步骤与常用参数
1.1.编译步骤
- 源码
hello.c
只有寥寥几行代码
#include <stdio.h>
int main(void)
{
printf("hello\n");
}
- 执行-E预处理,得到
hello.i
,生成了很长的.i文件
- -S编译
helloc.s
,这一步是最重要的,得到的反汇编文件,可以看出很多问题:
- -c汇编得到
hello.o
,知识将汇编指令翻译成机器指令,人看不懂
- 最后一步链接得到ELF文件,进行1.数据段合并、2.地址回填
1.2.常用指令选项
-
-v 查看gcc版本号
-
-I 指定头文件目录,注意ID和目录之间没有空格
hello.c
依赖目录inc
下的hello.h
,使用gcc hello.c -o hello
会报错:
需要-I 指定头文件目录:gcc hello.c -o hello -I./inc
补充说明——头文件守卫:比如这个hello.h
被某源文件一直#include "hello.h"、#include "hello.h"... ...,利用头文件守卫可以保证源文件只include一次该头文件的内容,避免重复包含
-
-c 只编译,生成.o文件,不进行链接
-
-g 包含调试信息,配合gdb使用,见gdb常用使用总结
-
-0n n=0~3 编译优化,n越大优化得越多
-
-Wall 提示更多警告信息,-w取消所有警告
-
-D
编译时定义宏,注意-D和 ,一般用于调试信息的开关之间没有空格 -
-E 生成预处理文件
-
-shared 制作动态库
-
-fPIC 生成位置无关的代码