Linux->gcc编译器
程序员文章站
2022-07-14 16:39:07
...
编译的四大步骤
预处理
- 去掉注释,展开所有代码
gcc -E main -o main.i //-E 成成一个预处理后文件
//-o 将生成的文件放到main.i中
//main.i中存放main.c包含的头文件
编译
- 语义语法纠错,将代码解释称为汇编代码,报错将在这一阶段进行
gcc -S main.i -o main.s //-S 将高级语言(C语言)解释称为汇编代码
汇编
- 将汇编代码解释成为机器指令代码
gcc -c main.s -o main.o // -c 将汇编代码解释称为机器语言
链接
- 链接代码库以及所有的目标文件,生成可执行程序
- 头文件:一些常用的功能(函数)的声明,相当于一份菜单
- 库文件:一些常用的功能(函数)的实现
- 链接生成可执行程序的时候,需要功能的具体实现,而在编译汇编的时候只需要有功能的声明即可
链接方式:
- 静态链接:将库中所有文件拷贝到目标文件,并且执行时也会拷贝到内存中
- 优点:执行时不需要依赖库的存在
- 缺点:造成大量的代码冗余,占用大量内存
- 动态链接:如果用到了某个功能,只在目标文件中记录该功能在动态库中的位置符号信息
- 优点:占用内存少
- 缺点:所依赖的动态库(运行时库、共享库)必须存在
gcc编译器默认的链接方式是动态库
gcc常用指令
选项 | 功能 |
---|---|
-c | 编译、汇编,不链接 |
-S | 编译,不进行汇编和链接 |
-E | 预处理 |
-v | 同时显示编译器的代码 |
-o 【文件】 | 将输出输入到指定文件 |
-x 【语言】 | 指定语言 |
–help | 显示帮助信息 |
–version | 显示版本信息 |
下面用一个简单的小程序演示一下:
程序内容:打印“哈哈哈”
执行指令(预处理):gcc -E test.c -o test.i
查看test.i:vim test.i
执行指令(编译):gcc -S test.i -o test.s
查看test.s:vim test.s
执行指令(汇编):gcc -c test.s -o test.o
查看test.o:vim test.o
如果需要直接编译成可执行文件则执行指令:gcc test.c -o test
运行test: ./test
上一篇: Python 数据可视化之 seaborn 使用详解
下一篇: publisher程序注释