继续来说说make
接着上篇帖子,我们继续来说说make,make就是linux下的应用程序,用来处理makefile这种文件。在linux中输入make时,将自动寻找名称为“Makefile” 的文件作为编译的处理文件,如果没有名称为”Makefile” 的文件,将继续查找名称为“makefile” 的文件。上一篇帖子中,小菜我使用的名称为小写的名称,即“makefile”,这个可以根据个人习惯。而makefile文件中主要定义的就是生成的目标,生成目标依赖的文件关系和生成目标的方法(也就是相应的命令)。
所以make工具的关键在于书写makefile文件,上次我们简单的介绍一个makefile文件,这次,我们举一个稍微复杂一点的例子。我们假设一个工程的结构如下:
demo1.c 需要demo1.h
demo2.c 需要 demo2.h
demo3.c 需要 demo3.h
mian.c 需要 mian.h
可以看到这个工程有4个源文件和4个头文件,我们如何书写makefile文件,使得make工具能够正确的编译链接这个工程呢,我们来尝试写一下:
我们来逐行解释一下这个makefile文件:
1. 第一行,all是我们要生成的目标,冒号后面的4个后缀为.o的是它依赖的4个目标文件,我们知道将目标文件经过编译器的链接就能生成最终的可执行程序。
第二行,这是一条简单的gcc编译命令,忘了的可以看之前的帖子。
2. 第三行,目标文件是main.o,依赖的文件时main.c和main.h。
类似的,第四行是生成main.o的命令
3. 下面的demo1.o, demo2.o, demo3.o 和main.o的情况类似,而生成这些目标的作用就是因为,在第一行中,生成all需要依赖这些后缀为.o的目标文件。
4. 最后两行的clean目标我们看起来有些不一样,因为它没有依赖文件,这种目标我们叫做伪目标。但是,它依然有自己的生成命令,我们可以看到这是一条删除命令,删除了中间生成的那些目标文件,只保留了最终的all。
执行这个makefile的过程是这样的:
1. 首先生成目标all需要依赖四个后缀为.o的文件,但是一开始没有这几个文件
2. 紧接着,先执行后面的语句,生成了这四个目标文件,然后all才能生成
3. 最终,因为伪目标clean,删除了生成的后缀为.o的4个文件,保留了all。
至此,这个例子我们也说完了,可能大家觉得这种处理方法很繁琐,现生成.o文件,再生成最终的all,为什么不直接生成all。是,没错。这里,我只是为了举个例子,水平有限,也可能不是太恰当,只是希望能将makefile说的更清楚一些。这里,我们提到了一个新的东西,就是伪目标,伪目标就是那些没有依赖文件的目标。有什么理解不对的地方,欢迎大家交流~
这个系类的笔记汇总贴在:linux应用程序开发入门笔记系列,欢迎大家交流指正~