首先我们需要明确概念gcc只能用来编译c语言,g++即可用来编译c语言,又可用来编译c++,但我们一般用gcc编译c,g++编译c++
一、gcc的使用
当我们写好代码以后可以直接
gcc test.c
然后它会自动生成一个可执行程序a.out
这个可执行程序的名字不重要,关键是它的属性具有可执行权限
然后我们直接使用如下命令,就可以进行运行了
./a.out
二.g++的使用
g++的使用与gcc是十分类似的
不过我们需要先安装一下g++
yum install gcc gcc-c++
安装以后,我们就可以使用g++编译c++代码了,它默认生成的就是a.out文件
三、gcc编译链接过程
我们知道执行一个c程序需要经过一下几个步骤
- 预处理
- 编译(生成汇编)
- 汇编(生成机器可识别代码)
- 链接(生成可执行文件或库文件)
1.预处理
在预处理过程中,会有如下操作
- 去掉注释
- 头文件展开
- 宏替换
- 条件编译
我们先来展示前三点
我们需要先输入如下指令
gcc -E test.c -o test.i
“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。
这里,我们还需要了解的一点是,我们为什么可以在windows或者linux上进行C/C++或者其他形式的开发呢?
这是因为我们的系统中一定要提前或者后序安装上,C/C++开发相关的头文件,库文件
而这些文件就在下面的路径中
/usr/include
然后我们可以打开一下比如stdio.h
而我们前面的头文件展开,就是将这里面的内容全部拷贝到test.i中
其实我们在安装vs2022的时候,还在安装的时候,就要选择对应的开发包,同步也在下载C的头文件和库文件也就是说,在windows也同步有着对应的文件
还有条件编译,也会在预处理阶段给解决掉
gcc -E test.c -o test.i
不过对于宏,我们也可以在编译时候去定义的
gcc -E test.c -o test.i -DDEBUG
而条件编译的作用就是
比如vs2022有社区版和专业版,而公司不可能会专门维护两份代码,所以社区版只是专业版裁剪掉了某些功能得到的,而这个裁剪用的就是条件编译.
2.编译(生成汇编)
在我们与预处理完以后,我们的代码其实还是C语言
所以我们下一步就是生成汇编
gcc -S test.i -o test.s
不过我们也可以从test.c直接生成汇编
gcc -S test.c -o test.s
生成以后就是这样的:
在这个阶段中,gcc 会检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言
3.汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的“.s”文件转成目标文件
在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
下一步
gcc -c test.s -o test.o
不过这次打开,我们看到的将会是这样的:
一片乱码,这是因为这个.o文件是二进制文件,而vim是文本编辑器。所以我们可以使用二进制查看工具比如od:
我们运行:
od test.o
4..链接(生成可执行文件或库文件)
我们直接将所有的目标文件进行链接起来即可
gcc test.o -o atest
最终这个atest就是我们的可执行文件,此处顺便附上运行结果
以下我会列举可执行程序的生成方式:
1.直接生成
gcc test.c
这种方式最终生成的可执行程序是a.out
2.
gcc test.c -o test
这种方式就和前面比较相似,直接将.c文件变成一个可执行程序test
不过也可以这样写,反正记住无论如何-o后面跟的永远都是最终的可执行程序
gcc -o test test.c