Makefile经典教程提纲与收藏

来源:互联网 发布:淘宝爱奇艺会员没了 编辑:程序博客网 时间:2024/06/06 18:22

学习makefile的意义就是,对于基于linux下的相关命令可无需手动敲,引入变量达到通用化操作目的.类似于windows下的.bat文件.


供个人收藏的一个Makefile的示例:

前提解释:

 $ <表示源文件,$ @表示目标文件。


最基本语法:<g++ 或者gcc语法 与makefile无关> 所以不要弄杂混了,学习的过程中.g++链接编译请参照http://blog.csdn.net/zhu2695/article/details/51340808

         g++  -c 源文件.cpp

         g++  源文件.o  –o 目标执行文件.

 

等同于:g++源文件 –o目标文件



.SUFFIXES:.c.o

CC=g++
SRCS=hello.c
OBJS=$(SRCS:.c=.o)
EXEC=hello


start:$(OBJS)
        $(CC) -o $(EXEC) $(OBJS)           #注释 :这句话等同于   $(CC) $(OBJS) -o $(EXEC)
        @echo 'MakeFile Conplate'


.c.o:
        $(CC) -o $@ -c $<


clean:
        rm -f $(OBJS)


cleanexe:
        rm -f $(EXEC) 






1.  ,标记:<依赖项可选>

<tab键:必须要这个键为开头>命令.
2. 这里要说明一点的是,clean不是一个文件,它只不过是一个动作名字,有点像C语言中的lable一样,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后明显得指出这个lable的名字。(应用:定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。)
3.依赖项关于文件会事先判断时候存在,然后再决定命令生成关系。
清空文件的稳健方法:
第一种:clean:
            rm edit $(objects)
 第二种:.PHONY: clean《优先选取这种》
       clean :
               -rmedit $(objects)
     4. 规则包含两个部分,一个是依赖关系,一个是生成目标的方法。
在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make所完成的也就是这个目标。
    5.在规则中使用通配符


"~"
波浪号(“~”)字符在文件名中也有比较特殊的用途。如果是“~/test”,这就表示当前用户的$HOME目录下的test目录。而“~hchen/test”则表示用户hchen的宿主目录下的test目录。(这些都是Unix下的小知识了,make也支持)而在Windows或是MS-DOS下,用户没有宿主目录,那么波浪号所指的目录则根据环境变量“HOME”而定。
"*"
通配符代替了你一系列的文件,如“*.c”表示所以后缀为c的文件。一个需要我们注意的是,如果我们的文件名中有通配符,如:“*”,那么可以用转义字符“\”,如“\*”来表示真实的“*”字符,而不是任意长度的字符串。
 
6. 在定义变量的值时,我们可以使用其它变量来构造变量的值,在Makefile中有两种方式来在用变量定义变量的值。
 
7.三、变量高级用法

这里介绍两种变量的高级使用方法,第一种是变量值的替换。

我们可以替换变量中的共有的部分,其格式是“$(var:a=b)”或是“${var:a=b}”,其意思是,把变量“var”中所有以“a”字串“结尾”的“a”替换成“b”字串。这里的“结尾”意思是“空格”或是“结束符”。

还是看一个示例吧:

foo := a.o b.o c.o
bar := $(foo:.o=.c)

这个示例中,我们先定义了一个“$(foo)”变量,而第二行的意思是把“$(foo)”中所有以“.o”字串“结尾”全部替换成“.c”,所以我们的“$(bar)”的值就是“a.c b.c c.c”。
另外一种变量替换的技术是以“静态模式”(参见前面章节)定义的,如:
foo := a.o b.o c.o
bar := $(foo:%.o=%.c)
这依赖于被替换字串中的有相同的模式,模式中必须包含一个“%”字符,这个例子同样让$(bar)变量的值为“a.c b.c c.c”。
前面说过,.PHONY意思表示clean是一个“伪目标”,。而在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。当然,clean的规则不要放在文件的开头,不然,这就会变成make的默认目标,相信谁也不愿意这样。不成文的规矩是——“clean从来都是放在文件的最后”。


原文转载自:http://blog.csdn.net/ruglcc/article/details/7814546/
 

0 0
原创粉丝点击