Makefile文件(一)

参考原文http://blog.csdn.net/liang13664759/article/details/1771246/

Makefile介绍:

Makefile告诉make命令如何编译和链接文件,规则:

1、如果这个工程没有编译过,那么所有c文件都要编译并链接

2、果果某几个c文件被修改,那么直编译被修改的c文件,并链接目标程序

3、如果头文件被改变,那么需要编译引用了这几个头文件的c文件并连接目标程序。

一、Makefile规则:

target... : prerequisites...

    command

...

...

说明:target 为目标文件,可以是obj,也可以是可执行文件,还可以是标签(我也还不知道标签是什么)

  prerequisites为,target所需要的文件或是目标

  command,make需要执行的命令(可任意shell命令)

  target的目标文件依赖于prerequisites中的文件,生成规则定义在command中。prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行,这是Makefile的规则,也是Makefile的核心。

二、Makefile例子

例如:一个工程3个头文件,8个c文件。

原始Makefile

edit:main.o kbd.o command.o display.o/

insert.o search.o files.o utils.o

  cc -o edit main.o kbd.o command.o display.o/

insert.o search.o files.o utils.o

main.o:main.c defs.h

  cc -c main.c

kbd.o:kbd.c defs.h command.h

  cc -c kbd.c

command.o:command.c  defs.h command.h

  cc -c command.c

display.o : display.c defs.h buffer.h

  cc -c display.c

insert.o: insert.c defs.h buffer.h

  cc -c insert.c

search.o:search.c defs.h buffer.h

  cc -c search.c

files.o: files.c defs.h buffer.h command.h

  cc -c files.c

utils.o: utils.c defs.h

  cc -c utils.c

clean://只是一个标签,其后没有依赖,make命令并不会执行其后定义的命令

  rm edit main.o kbd.o command.o display.o/      //仅当make clean显示指出标签名字,才执行其后面的命令

  insert.o search.o files.o utils.o

三、make工作

默认方式下,只输入make命令,那么:

1、make会在当前目录下找到名字叫做“Makefile”或“makefile”的文件。

2、如果找到,会找文件中的第一个目标文件(target),在上面例子中,他会找到“edit”文件,并将其作为最终的目标文件

3、如果edit不存在,或是edit所以来的文件的修改时间要比edit文件新,那么就会执行后面所定义的命令来生成edit文件

4、如果edit所依赖的.o文件不存在,那么make会在当前文件中找到目标为.o文件的依赖性,如果找到再根据那个规则生成.o文件

5、当然,c文件和h文件是存在的,于是make会生成.o文件,然后再用.o文件生成edit文件。

说明:make会一层一层地去找文件的依赖关系,直到编译出第一个目标文件,在寻找过程中,如果出现错误,比如最后被依赖的问文件找不到,那么make就会直接退出并报错;而对于所定义的命令的错误或是编译不成功,make根本不理会。

所以,clean这种没有被第一个目标文件直接或间接关联,后面所定义的命令不会被自动执行。但是可以显示要make的执行,“make clean”。

编译中,如果其中一个源文件被修改,file.c,那么file.o会被重新编译,所以file.o是新的文件,比edit要新,所以edit也会被重新连接。如果改变了“command.h”,那么kbd.o、command.o和files.o都会被编译,并且,edit会被重新连接。

四、Makefile中使用变量

objects=main.o kbd.o command.o display.o/

insert.o search.o files.o utils.o

edit:$(objects)

  cc -o edit $(objects)

main.o:main.c defs.h

  cc -c main.c

......

clean:

  rm edit $(objects)

五、让make自动推导

只要make看到一个.o文件,他会自动把.c文件加到依赖关系中,如果make找到一个whatever.o,那么whatever.c就会是whatever.o的依赖文件。并且cc -c whatever.c也会被推导出来,于是

make的 "隐晦规则"

objects = main.o kbd.o command.o display.o/

insert.o search.o files.o utils.o

edit : $(objects)

cc -o edit $(objects)

main.o:defs.h

kbd.o:defs.h command.h

command.o: defs.h command.h

display.o : defs.h buffer.h

insert.o: defs.h buffer.h

search.o: defs.h buffer.h

files.o: defs.h buffer.h command.h

utils.o: defs.h

.PHONY:clean  //.PHONY表示clean是个伪目标文件

clean:

rm edit $(objects)

六、另类风格的Makefile:

objects = main.o kbd.o command.o display.o/

insert.o search.o files.o utils.o

edit: $(objects)

  cc -o edit $(objects)

$(objects): defs.h

kbd.o command.o files.o: command.h

display.o insert.o search.o files.o: buffer.h

.PHONY:clean

clean:

rm edit $(objects)

七、清空目标文件规则

makeMakefile都用该写一个清空目标文件(.o和执行文件)的规则,不仅便于重新编译,也利于保持文件的清洁。

一般:

clean:
  rm edit $(objects)

更为稳健的做法:

.PHONY: clean

clean:

  -rm edit $(objects)//rm前面的-,表示就算某些文件出现问题也继续做后面的事情。

说明:clean的规则不要放在文件的开头,不然就会成为make的默认目标。一般,clean都是放在文件的最后。

  

时间: 2024-10-27 03:38:20

Makefile文件(一)的相关文章

linux中make命令的简单使用以及Makefile文件的书写

Makefile 会不会写makele,从一个侧面说明了一个是否具备完成大型工程的能力. 一个工程中的源件不计数,其按类型.功能.模块分别放在若干个目录中,makele定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makele就像一个Shell脚本一样,其中也可以执行操作系统的命令.makele带来的好处就是"自动化编译",一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率. ma

Makefile文件编写和autotools的使用

在Linux或Unix环境下,对于只含有几个源代码文件的小程序(如hello.c)的编译,可以手工键入gcc命令对源代码文件逐个进行编译:然而在大型的项目开发中,可能涉及几十到几百个源文件,采用手工键入的方式进行编译,则非常不方便,而且一旦修改了源代码,尤其头文件发生了的修改,采用手工方式进行编译和维护的工作量相当大,而且容易出错.所以在Linux或Unix环境下,人们通常利用GNU make工具来自动完成应用程序的维护和编译工作.实际上,GNU make工具通过一个称为Makefile的文件来

Makefile文件(三)_书写规则

Makefile书写规则包含两部分,一个是依赖关系,一个是生成目标.在Makefile中,规则的顺序很重要,因为Makefile中只有一个最终目标.一般,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终目标.如果第一条规则中的目标有多个,那么第一个目标会成为最终目标,也就是make所完成的目标. 一.规则举例 foo.o:foo.c defs.h  #foo模块 cc -c -g foo.c 这个规则告诉我们:文件的依赖关系,还有如果要生成或更新foo.o文件,则

C++学习笔记25:makefile文件2

Makefile文件语法 行解析:命令按行解析 命令行的行首字符为Tab键,其他行的行首字符不得为Tab键,但可以使用多个空格缩进 换行:命令太长时,行尾使用"\"换行 注释:行首字符为"#"的文本行 关闭回显:在行首字符后和命令前添加"@" 未关闭回显时,make会首先回显(打印)命令,然后执行该命令 通常仅在注释和纯显示的echo命令前使用此功能 include filename:包含其他文件 处理模式与c/c++类似 行首加"-&

工程管理之makefile与自动创建makefile文件过程

(风雪之隅 http://www.laruence.com/2009/11/18/1154.html) Linux Makefile自动编译和链接使用的环境 想知道到Linux Makefile系统的真相么,想知道Linux Makefile系统中藏有的内在奥义么,只有我来给大家全面讲解介绍Linux Makefile系统作为Linux下的程序开发人员,大家一定都遇到过Linux Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Linux Mak

Linux平台Makefile文件的编写基础入门(课堂作业)

根据老师的要求,写一个超简单的makefile准备:       准备三个文件:file1.c, file2.c, file2.h       file1.c: #include "file2.h" int main() { printf("print file1$$$$$$$$$$$$$$$$$$$$$$$$\n"); File2Print(); return 0; } file2.h: #include <stdio.h> #ifndef FILE2

Linux学习之Makefile文件的编写

转自:http://goodcandle.cnblogs.com/archive/2006/03/30/278702.html 目的:       基本掌握了 make 的用法,能在Linux系统上编程.环境:       Linux系统,或者有一台Linux服务器,通过终端连接.一句话:有Linux编译环境.准备:       准备三个文件:file1.c, file2.c, file2.h       file1.c:              #include <stdio.h>    

从简入难makefile文件编写,Linux C++编程,简单vi命令

 1.一个最基本的C++程序 2.第二个c++程序 3.第一个入门级别的简单的makefile 4.在makefile中定义变量. 5.编写makefile的依赖 如果start:标识后面的某个.o没有,则重新编译没有编译的那个文件 6.最终的makefile文件 总结:makefile是通过.o文件是否存在已经.cpp最后的修改时间来判断是否重新编译.o文件. 7.makefile不管理.h文件,它是编译器来进行管理的. vi: i在光标之前插入 a在光标后面插入 x删除后面的字符 dd删

C++学习笔记24:makefile文件

makefile make命令:负责c/c++程序编译与链接 make根据指定命令进行建构 建构规则文件:GNUmakefile , makefile,Makefile makefile 文件格式 makefile 语法 --基本语法,变量,条件判断,循环,函数 makefile 文件的基本格式 target...:prerequisites... [tab键]  commands makefile文件的规则 makefile 文件由一系列规则构成 规则目的:建构目标的先决条件是什么以及如何构建

Contiki 2.7 Makefile 文件(四)

3.第三部分 这里我们假设TARGET为native (1) OBJECTDIR = obj_$(TARGET) LOWERCASE = -abcdefghijklmnopqrstuvwxyz UPPERCASE = _ABCDEFGHIJKLMNOPQRSTUVWXYZ TARGET_UPPERCASE := ${strip ${shell echo $(TARGET) | sed y!$(LOWERCASE)!$(UPPERCASE)!}} CFLAGS += -DCONTIKI=1 -DC