一、什么是GCC?
GCC(the GNU Compiler Collection)GCC是GNU编译器集合,它包括了C/C++、Objective-C、Fortran、Ada和Go语言的前端和对应的库(libstdc++)GCC初衷是为完全免费的GNU系统编写的编译器。
二、程序编写到执行过程是怎么样的?一个C程序从编辑到执行需要经过以下过程:
#mermaid-svg-nTfl1Lnfc30PYa0H {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-nTfl1Lnfc30PYa0H .error-icon{fill:#552222;}#mermaid-svg-nTfl1Lnfc30PYa0H .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nTfl1Lnfc30PYa0H .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-nTfl1Lnfc30PYa0H .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nTfl1Lnfc30PYa0H .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nTfl1Lnfc30PYa0H .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nTfl1Lnfc30PYa0H .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nTfl1Lnfc30PYa0H .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nTfl1Lnfc30PYa0H .marker.cross{stroke:#333333;}#mermaid-svg-nTfl1Lnfc30PYa0H svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nTfl1Lnfc30PYa0H .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-nTfl1Lnfc30PYa0H .cluster-label text{fill:#333;}#mermaid-svg-nTfl1Lnfc30PYa0H .cluster-label span{color:#333;}#mermaid-svg-nTfl1Lnfc30PYa0H .label text,#mermaid-svg-nTfl1Lnfc30PYa0H span{fill:#333;color:#333;}#mermaid-svg-nTfl1Lnfc30PYa0H .node rect,#mermaid-svg-nTfl1Lnfc30PYa0H .node circle,#mermaid-svg-nTfl1Lnfc30PYa0H .node ellipse,#mermaid-svg-nTfl1Lnfc30PYa0H .node polygon,#mermaid-svg-nTfl1Lnfc30PYa0H .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-nTfl1Lnfc30PYa0H .node .label{text-align:center;}#mermaid-svg-nTfl1Lnfc30PYa0H .node.clickable{cursor:pointer;}#mermaid-svg-nTfl1Lnfc30PYa0H .arrowheadPath{fill:#333333;}#mermaid-svg-nTfl1Lnfc30PYa0H .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-nTfl1Lnfc30PYa0H .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-nTfl1Lnfc30PYa0H .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-nTfl1Lnfc30PYa0H .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-nTfl1Lnfc30PYa0H .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-nTfl1Lnfc30PYa0H .cluster text{fill:#333;}#mermaid-svg-nTfl1Lnfc30PYa0H .cluster span{color:#333;}#mermaid-svg-nTfl1Lnfc30PYa0H div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-nTfl1Lnfc30PYa0H :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
三、编译过程中文件内容的变化
预处理
汇编
编译
链接
载入内存并链接依赖库
编写源代码_*.c/*.cpp
已预处理文件_*.i
汇编文件_*.s
目标文件_*.o
可执行或者库文件_*.exe/*.so/*.a
程序被CPU执行
编译一共需要处理四个文件(CISO):
- 源代码文件(*.c)
- 预处理文件(*.i)
- 汇编文件(*.s)
- 目标文件(*.o)
最后一步处理目标文件的过程称为链接,链接后将生成可执行或者库。下面通过观察处理的中间代码(CISO)建立编译过程的直观感受:
假如我编辑并保存了如下程序
//gcctest.cpp
#include
using namespace std;
#define AAA 33333
int main()
{
double a=3.14;//ordinary variable
double &r=a;//ordinary referenece
cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?