【Linux】开发工具3 : gcc/g++的使用
其他篇章 【C语言专栏】
其他篇章【Linux专栏】
上期回顾 【Linux】开发工具2:vim
文章目录
- 前言
- 1. gcc/g++的使用
- 1.1 预处理(进行宏替换)
- 1.2 编译(生成汇编)
- 1.3 汇编(生成机器可识别代码)
- 1.4 链接(生成可执行文件或库文件)
- 1.5 gcc 可以一步生成一个执行程序(将四个步骤合并)
前言
在使用一门编辑语言的时候,我们都必须安装相应的开发包(即头文件和库文件)
- 头文件:函数的声明
- 库文件:函数的实现
查看头文件:ls /usr/include/
1. gcc/g++的使用
- gcc:编译C语言
- g++:编译 C/C++
生成可执行文件:预处理、编译、汇编、链接
1.1 预处理(进行宏替换)
主要处理以# 开头的指令,核心任务有:
- 宏替换:把所有 #define 定义的宏(包括函数宏、常量宏),直接替换成对应的文本。
- 去注释:注释不参与编译,去掉可以减少文件大小
- 条件编译:#ifdef / #ifndef / #if / #else / #endif 等指令,只保留满足条件的代码段,删除不满足的分支。
- 头文件展开:把 #include <xxx.h> / #include “xxx.h” 对应的头文件内容,完整复制到当前文件中。
命令:gcc -E test.c -o test.i
- 选项“-E”,该选项的作⽤是让 gcc 在预处理结束后停⽌编译过程。
- 选项“-o”是指⽬标⽂件,“.i”⽂件为已经过预处理的C原始程序。
!!!注意区分:
| 命令 | 作用 | 生成的文件类型 | 能否直接运行 |
|---|---|---|---|
| gcc -E test.c -o test.i | 只做预处理 | C源码文件 ( .i ) | 不能 |
| gcc test.c -o test | 完整编译+链接 | 可执行程序 | 可以 |
示例:
结果:
解析:
#define DEBUG 1 :定义了一个名为 DEBUG 的宏,值为1。
#ifdef DEBUG :预处理指令,意思是“如果 DEBUG 这个宏被定义了,就执行下面的代码”。
因为 DEBUG 已经被定义了,所以预处理时会保留 printf(“Debug mode\n”);
这行代码,程序运行时会打印 Debug mode 。
1.2 编译(生成汇编)
- 在这个阶段中,gcc ⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作,在检查⽆误后,gcc 把代码翻译成汇编语⾔。
- -S:(仅执行编译,停止后续流程)
- .s:输出的汇编文件(test.s)
命令:gcc –S test.i –o test.s
[qianyv@VM-0-9-centos~]$ gcc-S test.c-o test.s[qianyv@VM-0-9-centos~]$ ll total28-rw-rw-r--1qianyv qianyv135Apr2614:19test.c-rw-rw-r--1qianyv qianyv16878Apr2614:11test.i-rw-rw-r--1qianyv qianyv446Apr2615:00test.s-rw-r--r--1root root0Apr1922:08test.txt1.3 汇编(生成机器可识别代码)
汇编阶段是把编译阶段⽣成的“.s”⽂件转成⽬标⽂件
- -c:仅执行汇编,生成目标文件
- .o:输出的目标文件(test.o)—二进制格式,不能执行
命令:gcc –c test.s –o test.o
[qianyv@VM-0-9-centos~]$ gcc-c test.s-o test.o[qianyv@VM-0-9-centos~]$ ll total32-rw-rw-r--1qianyv qianyv135Apr2614:19test.c-rw-rw-r--1qianyv qianyv16878Apr2614:11test.i-rw-rw-r--1qianyv qianyv1496Apr2615:03test.o-rw-rw-r--1qianyv qianyv446Apr2615:00test.s-rw-r--r--1root root0Apr1922:08test.txt1.4 链接(生成可执行文件或库文件)
将目标文件(.o)和库进行链接,就得到了可执行程序
- -o:用来指定可执行程序的名称(这里我写了是test),不写的话默认是 a.out
gcc test.o -o test
[qianyv@VM-0-9-centos~]$ gcc test.o-o test[qianyv@VM-0-9-centos~]$ ll total44-rwxrwxr-x1qianyv qianyv8360Apr2615:08test-rw-rw-r--1qianyv qianyv135Apr2614:19test.c-rw-rw-r--1qianyv qianyv16878Apr2614:11test.i-rw-rw-r--1qianyv qianyv1496Apr2615:03test.o-rw-rw-r--1qianyv qianyv446Apr2615:00test.s-rw-r--r--1root root0Apr1922:08test.txt