xushxbigbear微信 2020-05-16
Linux 中却不能这样,需要我们去手动的完成这项工作。不懂 Makefile,就操作不了多文件编程,就完成不了相对于大的工程项目的操作。如果你想在 Linux(Unix) 环境下做开发的话,Makefile 是必须掌握的一项技能。
Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接等规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。编译整个工程需要涉及到的,在 Makefile 中都可以进行描述。换句话说,Makefile 可以使得我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数。
在Linux下开发如果要编译的源文件很多的情况下,会遇到下列问题:
对于上面的这些以及等等很多问题都可以使用Makefile很好的解决。
Makefile结构:Makefile里主要包含了五个东西:
Makefile文件由一系列规则(rules)构成。Makefile的规则主要是两个部分组成,分别是依赖的关系和执行的命令,也就是构建目标的前置条件,以及如何构建。每条规则形式如下:
targets : prerequisites [tab]command
或者是
targets : prerequisites; command [tab]command
注意:目标和依赖文件之间要使用冒号分隔开,命令的开始一定要使用Tab键,不能用空格代替。
例:
test:test.c gcc -o test test.c
#编译 test.c 文件。其中 test 是目标文件,也是我们的最终生成的可执行文件,依赖文件就是 test.c 源文件。
当我们在执行 make 条命令的时候,make 就会去当前文件下找要执行的编译规则,也就是 Makefile 文件。我们编写 Makefile 的时可以使用的文件的名称 "GNUmakefile" 、"makefile" 、"Makefile" ,make 执行时回去寻找 Makefile 文件,找文件的顺序也是这样的。
推荐使用 Makefile。如果文件不存在,make 就会给我们报错,提示:
make:*** 没有明确目标并且找不到 makefile。停止
当在 shell 提示符下输入 make 命令以后。 make 读取当前目录下的 Makefile 文件并开始处理第一个规则。
GNU make的工作方式
1.读入主Makefile (主Makefile中可以引用其他Makefile) 2.读入被include的其他Makefile 3.初始化文件中的变量 4.推导隐晦规则, 并分析所有规则 5.为所有的目标文件创建依赖关系链 6.根据依赖关系, 决定哪些目标要重新生成 7.执行生成命令