gcc介绍
gcc是一款编译C语言编译器,可以把我们用vim写的代码编译成可执行程序。编译C++用g++进行编译,C++的文件后缀是test.cc或test.cpp或test.cxx
如果要安装g++就执行以下命令
sudo yum install gcc-c++//g++内核底层是gcc
gcc + 程序 就会形成可执行文件,默认是a.out,如果目录下已经存在,那么就会把a.out覆盖掉。
gcc -o + newname + 程序:给编译后的可执行程序重命名
gcc + 程序 -o + newname:给编译后的可执行程序重命名
程序的翻译过程
程序的翻译过程包括预编译,编译,汇编和链接
预编译
预编译就是把程序进行宏替换,去注释,头文件展开等等,把代码变简单,预编译过后还是C语言文件
需要理解的是,添加头文件是添加声明,就算我们不添加头文件,我们自己声明函数在C文件的开头也是可以的。
通过vim写下面一串代码,演示预编译的过程
gcc -E test.c -o newname//预处理命令
通过上述命令把生成的预编译文件写进新建的文件,建议后缀为“ .i ”,如果没有新的文件名,那么新建的文件就会打印在屏幕上。
用vim打开预编译后的文件,发现头文件展开了,宏被替换了,注释也没有了
编译
编译的过程是进行词法分析和语法分析的过程,然后把C语言编译成汇编语言。并且对自己的符号进行汇总,就是对自己定义的变量函数等汇总起来
gcc -S 预编译过的文件 -o newname//生成汇编文件的命令
也可以直接从c文件直接变为汇编文件
用vim打开刚刚生成的文件,里面就是汇编语言
汇编
把汇编语言编译成为二进制目标文件
Windows里面生成的文件就是obj为后缀的文件,就是目标文件
每个C文件都会生成一个obj文件
还有对上一步编译汇总得到的符号生成符号表。
gcc -c 汇编过的文件 -o newname//生成可重定位目标文件的命令
下面是Windows下面两个C文件分别生成的obj文件。
链接
把库函数以及其他目标文件链接起来形成可执行程序
链接是一个复杂的过程,链接的时候需要把一堆文件链接在一起才生成可执行程序。
链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。重定位就是将上面的符号表进行修正得到真正的地址的过程。
链接解决的是一个项目中多文件、多模块之间互相调用的问题。
gcc test.o -o newname
也可以直接gcc test.o 后面什么都不加,直接形成可执行程序,这就是链接的过程
上述命令和最开始一部形成可执行文件一样,都是gcc + 文件
命令行式宏定义
如图,没有v1 的宏定义,但是可以通过命令行式的定义宏
gcc -D v1 test.c
如图2,这种定义宏的方式,可以更方便的改变宏