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

文章目录

  • 一 ,gcc (编译器)
    • 1. gcc 命令格式
      • gcc选项
    • 2.完成过程
      • 2.1预处理
      • 2.2 编译(生成汇编)
      • 2.3 汇编(生成机器可识别代码)
      • 2.4 链接 (生成可执行文件)
  • 二, make/Makefile
    • 1.简单介绍
    • 2.示例代码
    • 3.原理
    • 4.项目清理
  • 三 几种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”文件为已经
Linux编译器-gcc 的使用以及 make/Makefile的用法_第1张图片
Linux编译器-gcc 的使用以及 make/Makefile的用法_第2张图片

2.2 编译(生成汇编)

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

Linux编译器-gcc 的使用以及 make/Makefile的用法_第3张图片

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

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

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

在成功编译之后,就进入了链接阶段。
实例: gcc hello.o –o hello
Linux编译器-gcc 的使用以及 make/Makefile的用法_第4张图片

二, make/Makefile

1.简单介绍

make 是命令
Makefile是文件

2.示例代码

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

Makefile 文件
Linux编译器-gcc 的使用以及 make/Makefile的用法_第5张图片

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 目标文件声明成伪目标,测试一下

Linux编译器-gcc 的使用以及 make/Makefile的用法_第6张图片

三 几种Makefile的常见写法

我就拿最简单的 Hello World 程序来说:
Linux编译器-gcc 的使用以及 make/Makefile的用法_第7张图片
第一种:最简单的
Linux编译器-gcc 的使用以及 make/Makefile的用法_第8张图片
Linux编译器-gcc 的使用以及 make/Makefile的用法_第9张图片
第二种:

Linux编译器-gcc 的使用以及 make/Makefile的用法_第10张图片

你可能感兴趣的:(linux,linux)