GCC使用及其常用选项介绍

GCC使用及其常用选项介绍

嵌入式C高级个人总结


目录

  • GCC使用及其常用选项介绍
  • 前言
  • 一、GCC概述
  • 二、C语言的编译过程
    • 1.预处理
    • 2.编译
    • 3.汇编
    • 4.链接
  • 总结


前言

【重点】
1.掌握C语言是如何变成机器指令的过程
2.gcc工具的几个常用选项的意义

【难点】
C编译过程中在gcc工具上的体现

【实验考核】
自己编写程序,利用gcc工具集验证每一步的执行效果
举例说明gcc选项的意义:
gcc -l gcc -L
gcc -E gcc -S gcc -c。


一、GCC概述

GCC最初的全名是GNU C Compiler(C 编译器),只能处理C语言。但其很快扩展,变得可处理C++,后来又扩展为能够支持更多编程语言,如Fortran、Pascal、Objective -C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)(编译器集合)

GNU:嵌入式开源社区的标杆,或者规范

GCC相当于“翻译官”、“翻译组织”,是一个完成高级语言向机器语言翻译的一个工具集合

GCC在工作中是根据文件后缀名不同来调用不同的翻译器的

gcc -o 其中-o就像ouput ,输出的意思

Linux:gcc -o 输出文件名	输入文件名

”-o“标识符和输出文件名之间不能有任何的其它选项

输入文件名可以放在 -o前面,也可以放最后

gcc -v -o 输出文件名 输入文件名:加上-v后会打印gcc调用“翻译官”进行C语言到机器语言转化的详细过程

二、C语言的编译过程

1.预处理

作用:进行宏的替换,如对#include #define 进行处理,把要导入的导入,要替换的替换,所以在后续进行编译的时候是没有include和define的,所以.i文件里都是一些库函数的声明。
【gcc -E】
使用:gcc -E -o 001.i 001.c

代码如下(示例):

ubuntu@ubuntu:~/001$ gcc -E -o 001.i 001.c
ubuntu@ubuntu:~/001$ ls
001.c  001.i

2.编译

在gcc -v 查看c文件编译过程中,有这样一条信息:/usr/lib/gcc/x86_64-linux-gnu/7/cc1 xxx.c -o xxx.s,不同的系统信息可能不同
这里的cc1是编译器,把xxx.c文件转化为xxx.s文件,.s文件里是汇编指令
【gcc -S】
使用:gcc -S -o 001.s 001.i

代码如下(示例):

ubuntu@ubuntu:~/001$ gcc -S -o 001.s 001.i
ubuntu@ubuntu:~/001$ ls
001.c  001.i  001.s

3.汇编

查看汇编过程可以看到:as -v --64 -o /tmp/ccdIWJ3t.o /tmp/ccY9ENkf.s
as是汇编指令,把xxx.s文件转化为xxx.o文件,.o文件里是二进制代码,是给机器看的,我们看不懂
【gcc -c】

1.使用这条指令会先进行编译,再汇编,因为不会把.c文件直接转为.o文件,必须要有中间的.s文件,所以想将.c文件直接转为.o,可用下面这条指令
使用:gcc -c -o 001.o 001.c

代码如下(示例):

ubuntu@ubuntu:~/001$ gcc -c -o 001.o 001.c
ubuntu@ubuntu:~/001$ ls
001.c  001.o

2.如果在前一步编译中已经生成了.s文件,则这里就可以直接使用.s文件

使用:gcc -c -o 001.o 001.s

代码如下(示例):

ubuntu@ubuntu:~/001$ gcc -c -o 001.o 001.s
ubuntu@ubuntu:~/001$ ls
001.c  001.i  001.o  001.s

4.链接

查看链接过程可以看到 /usr/lib/gcc/x86_64-linux-gnu/7/collect2 -o 001 xxx.o+xxxx.o+…o
【gcc -o】
过程:编译(.s)->汇编(.o)->链接(可执行)

1.如果不给出输出文件名,gcc就给出预设的可执行文件a.out。
如果是从前面步骤一路执行过来的,则这里可以选择将.o文件链接成可执行文件
使用:gcc -o 001 001.o

代码如下(示例):

ubuntu@ubuntu:~/001$ gcc -o 001 001.o
ubuntu@ubuntu:~/001$ ls
001  001.c  001.i  001.o  001.s

2.平时为了方便,我们直接使用gcc -o 001 001.c指令,则编译器也会默认帮我们进行前面的步骤,因为编译过程都是要一步一步执行过来的,只不过编译器在生成中间文件时又将该文件进行了后续的操作,所以给人的感觉是一条指令就完成了。

代码如下(示例):

ubuntu@ubuntu:~/001$ gcc -o 001 001.c
ubuntu@ubuntu:~/001$ ls
001  001.c

总结

1.明白C语言从高级语言到机器语言的转变过程,每个过程在Linux中使用的指令是什么,会生成哪种文件,每种文件里的内容是什么。
2.linux系统中潜规则:0代表成功,其它代表失败。

你可能感兴趣的:(C语言,c语言,gcc/gdb编译调试)