Linux编译器-gcc 的使用以及 make/Makefile的用法

一 ,gcc (编译器)

1. gcc 命令格式

格式 gcc [选项] 要编译的文件 [选项] [目标文件]

gcc选项

-E     只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S     编译到汇编语言不进行汇编和链接
-c     编译到目标代码
-o     文件输出到 文件
-static   此选项对生成的文件采用静态链接
-g     生成调试信息。GNU 调试器可利用该信息。
-shared  此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-O0
-O1
-O2
-O3   编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w    不生成任何警告信息。
-Wall  生成所有警告信息。

2.完成过程

2.1预处理

预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经
在这里插入图片描述
在这里插入图片描述

2.2 编译(生成汇编)

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查
无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例:gcc –S hello.i –o hello.s

在这里插入图片描述

2.3 汇编(生成机器可识别代码)

汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc –c hello.s –o hello.o

2.4 链接 (生成可执行文件)

在成功编译之后,就进入了链接阶段。
实例: gcc hello.o –o hello
在这里插入图片描述

二, make/Makefile

1.简单介绍

make 是命令
Makefile是文件

2.示例代码

#include<stdio.h>
int main()
{
  //打印"hello Linux!"
  printf("hello Linux!\n");
  return 0;
}

Makefile 文件
在这里插入图片描述

3.原理

make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么

  1. make会先在当前目录中找“Makefile”或“makefile”文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),上面的例子中,他就会找到“hello”这个文件,把这个文件作为最终的目标文件。
  3. 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的修改时间比hello这个文件新,那么,他就会执行后面的命令来重写生成hello文件。
  4. 如果hello所依赖的hello.o文件不存在,那么make就会在当前的文件中找hello.o这一文件所依赖的关系和文件,来生成它。
    5.hello.o 文件就是依赖于hello.h 和hello.c文件生成的。
  5. 所以说makefile文件的依赖性很强,层层递进。
  6. 如果在层层寻找的过程中,找不到依赖文件,或者有未定义的语法,就会报错,然后退出。
  7. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

4.项目清理

工程是需要被清理的

像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
可以将我们的 hello 目标文件声明成伪目标,测试一下

在这里插入图片描述

三 几种Makefile的常见写法

我就拿最简单的 Hello World 程序来说:
在这里插入图片描述
第一种:最简单的
在这里插入图片描述
在这里插入图片描述
第二种:

在这里插入图片描述

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值