linux环境下gcc和编译器简介及使用

编译器和gcc:

    什么是编译器:它是一个负责翻译的程序,它可以把人类能看懂的代码翻译成计算机能理解的二进制指令,它由预处理器、汇编器、编译器、链接器组成。

          gcc是GNU组织为了编译Linux内核而开发一款C语言编译器。

  

 以gcc为例,编译器是如何把C代码翻译成可执行的程序(面试时问的很多):

    1、把程序员所编写的C代码翻译成标准的C代码

        gcc -E hello.c 会把预处理的果显示在屏幕上

        gcc -E hello.c -o hello.i 会把预处理的结果保存到hello.i文件中,以.i结尾的文件也叫处理文件

    2、把预处理的结果翻译成汇编代码

        gcc -S hello.i 会生成以.s结尾的汇编文件

    3、把汇编代码翻译成二进制指令

        gcc -c hello.s 会生成以.o结尾的目标文件(二进制的)

    4、把若干个目标文件合并成一个可执行的程序

        gcc a.o b.o c.o ... 默认会生成一个叫a.out的可执行程序

        ./a.out 执行程序

    注意:gcc head.c 包含了以上四个步骤,gcc hello.c && ./a.out 编译并执行。

过程:

一.预处理

hello.c 经过预处理得到 hello.i

gcc -E hello.c -o hello.i

-E的含义:说明这是一个预处理操作 生成预处理文件(.i)

-o的含义:确定 输出文件的名称为output_filename 不能和源文件同名

预处理阶段做了什么事:

1.头文件展开

我们发现 原先只有几行的hello.c变成了上千行的hello.i

实际上 预处理完成的是 将头文件展开

所有#include的内容全部插入源代码

并且不会检查语法错误

因此 但凡被#include的文件

其所有文本内容都会被无脑插入源代码

2.宏定义替换

若#define x y 则将所有的x 以文本的层次 替换成y

什么叫做以文本的层次:

就是说这是无脑替换 不会检查语法错误 所以有时要注意运算顺序 加括号

专业术语就是:将宏名替换位宏值

3.删除注释

注释是给人看的 计算机不看这些 将注释替换位空行

4.展开条件编译

根据实际的define情况

在代码中智能添加 //dosomething

5.(以后更新)

#ifdef something

//do something

#endif

二.编译

hello.i 经过编译得到 hello.s

gcc -S hello.s -o hello.s

-S的含义:说明这是编译操作 生成汇编文件(.s)

(也可以从源文件一步到达.s)

注意是大写S 生成的文件格式是小写s

生成汇编指令

向下翻译 生成了约几十行的文本内容

这是 最接近底层 最接近机器语言的汇编语言(汇编指令)

编译过程会检查语法错误 如果语法不正确 则无法生成汇编语言

相比之下 预处理过程不会检查语法错误

因此 编译过程是整个4步骤过程中最耗时的 因为语法错误要逐行检查

三.汇编

hello.s 经过汇编得到 hello.o

gcc -c hello.s -o hello.o

-c的含义:说明这是执行汇编操作 生成目标文件(.o)

(也可以从源文件一步到达.o)

hello.o 是二进制文本内容

汇编指令被翻译成了二进制的机器指令

通常在记事本中以十六进制形成呈现

gcc编译器常用的参数:

    -E     预处理

    -S    生成汇编文件

    -c    生成目标文件

    -o    设置输出文件的名字,例如:gcc hello.c -o hello

    -I     指定头文件的路径,多文件编程时使用

    -l     指定要链接库名,例如:sqrt、pow等数学函数,需要额外链接数学库,gcc math.c -lm

    -L     指定要链接库的路径

    -D    编译时定义宏

    -g       编译时添加调试信息,这样编译出的可执行程序,可以使用gdb进行调试

    -Wall     显示代码中所有警告,编译时会变得非常严格,工作时、写项目需要添加的参数

    -Werror      把警告当作错误,只要代码中有警告,就无法生成可执行程序

    -std       指定编译时的语法标准,C语言的语法标准有:c89、c99、c11、c21

        -std=gnu89、-std=gnu99、-std=gnu11

你可能感兴趣的:(面试,开发语言,c语言,linux,vim)