在学习linux系统中认识到了makefile是必须要掌握的,一开始对于makefile(翻译:生成文件)不理解,经过几天的学习对makefile也有了一定的理解: 一、Makefile的作用:
makefile 关系到整个工程的编译规则,一个工程文件不计其数,其按类型,功能,模块分别放在不同的目录下,makefile定义了一些规则来指定,哪些文件需要先编译,哪些文件需要重新编译,甚至进行更复杂的功能操作,因为makefile就像一个shell脚本一样,其中也可以执行操作系统命令。也就是通过makefile规则编写makefile文件来实现执行文件的生成,makefile对于多个文件生成的执行文件,若有某个发生改变后,makefile可以发现直接去编译,从而减少了从头开始编译的时间,提高编译效率,同时也可以很方便的修改文件,添加或者删去某些文件。 二、Makefile的规则:
1. 隐晦规则:就是利用make 的 自动推导的功能
2. 显示规则:就是显示的在命令行中写出目标文件的依赖关系 3. 变量的定义:就变量的宏替换
4. 文件指示:其中包括三部分的内容,一个是在一个makefile中引用另一个makefile,就像c语言中的include 一样;另一个是根据某些情况指定makefile中的有效部分,就像c语言的预编译#ifdef一样;还有一个就是定义一个多行的命令。
5.
注释:只有行注释用#号字符注释 如果你的makefile中用到了# 你
可以用“\\#“转义
一、把源代码编译成目标代码一般是一个规则。 二、把所有中间文件编译链接在一起也是一个规则。
编译需要一定的依赖文件,例如把一个.c文件编译为一个可执行文件,则一般是通过:先有.c再到 .o然后到 执行文件 例子:#要想生成hello.o目标,必须先有hello.c, 然后调用命令行gcc编译生成hello.o 依赖对象hello.c hello.o:hello.c
gcc –c hello.c –o hello.o
要想生成执行程序hello,必须先执行规则hello.o, 然后调用命令行gcc链接生成hello hello:hello.o
gcc hello.o –o hello
在例子中hello.o要依赖hello.c调用gcc编译器才能生成,执行文件hello要依赖hello.o
Makefile可以理解为由make程序进行解释的一种特殊脚本。
(备注:脚本通常可以由应用程序临时调用并执行。各类脚本被广泛地
应用于网页设计中,因为脚本不仅可以减小网页的规模和提高网页浏览速度,而且可以丰富网页的表现,如动画、声音等。举个最常见的例子,当点击网页上的Email地址时能自动调用Outlook Express或Foxmail这类邮箱软件,就是通过脚本功能来实现的)
首先make找到Makefile的入口规则,一般是all,或者是用户在命令行指定的target
顺着入口规则的依赖对象查找下去,检查一直查找到最终的目标,即只有被依赖而没有依赖其它对象的目标.即终目标
从最终目标顺着依赖关系依次执行到入口规则,中间只有运行命令出错,才停止执行.
如果是依赖文件,make会自动检测最后更新时间,只会去执行已经修改过的文件,以此来减少编译时间 三、在makefile也可以定义变量。
如赋值:定义变量可在规则中使用,Makefile 中使用变量 Makefile中的变量就像是c 语言的中宏一样 怎样定义变量呢?
我们在makefile最上面定义 一个变量
OBJS = main.o func1.o func2.o func3.o func4.o func5.o
引用变量 $(OBJS) 这就等价于main.o func1.o func2.o func3.o func4.o func5.o 就像宏一样的会被替换掉,等价后如果一个生成文件需要依赖main.o func1.o func2.o func3.o func4.o func5.o多个.o文件,则可用$(OBJS)代替。
Makefile还有自推导,判断源代码的依赖关系的功能,也就是不用我
们去为了.o文件而编写其他命令,例如:只要make看到一个*.o文件,它
就会自动的把 *.c文件 加到 依赖关系中,如果make 找到一个 func2.o 那么func2.c 就会使func2.o 的依赖文件。并且gcc –c func2.c 也会被推导出来。所以我们的makefile就会简单多了
在编写makefile是也有很多小细节值得注意,最为重要的一点就是命开头的空格是用tab键生成的,命令间空格也是tab键生成,还有赋值方式 = 和 := 许多换行等许多应用需要注意,makefile的功能
很是强大,上述只是简单操作入门。