Make工程管理器

来源:互联网 发布:51单片机循迹小车 编辑:程序博客网 时间:2024/05/21 07:10

参考《从实践中学嵌入式linux C》,把里面的例子精简如下。基本上就没有太多多余文字了,单看代码和图表应该就能懂了。

Makefile结构

target : dependency_file

    command

例子

Makefile里面内容

hello: hello.c        gcc -c hello.c -o hello.o
执行

norton@norton-laptop:~/learning/sample code/gdb_prac$ make hellogcc -c hello.c -o hello.onorton@norton-laptop:~/learning/sample code/gdb_prac$ lshello.c  hello.o  Makefile
可以看到,通过hello这个target名称调用了它的command,从而得到hello.o


复杂点的Makefle如下;edit是可执行文件,而*.o是edit程序依赖的目标文件。

edit:main.o kdb.o command.o         gcc -o edit main.o kdb.o command.omain.o:main.c def.h        gcc -c main.c -o main.okdb.o:kdb.c def.h command.h        gcc -c kdb.c -o kdb.ocommand.o: command.c def.h command.h        gcc -c command.c -o command.oclean:        rm edit main.o kdb.o command.o
make工程管理器并不关心command如何工作。target不是文件,如clean不是一个文件,而是一个command的代名词。


Makefile变量

递归展开定义  VAR = var 

有时候会导致无限循环。,如CFLAGS = $(CFLAGS)-O被递归展开。

简单扩展定义  VAR := var (只展开一次,避免无限循环的可能性)  


变量名:

区分大小写,避免使用下划线和数字,因为可能在使用过程中,这些字符会被赋予特殊含义。

建议:使用小写作为变量名;大写作为隐含规则参数,或用户重载命令选项参数的变量名。

如上面的函数可以改为

OBJS=main.o kdb.o command.o edit:$(OBJS)        gcc -o edit $(OBJS)main.o:main.c def.h        gcc -c main.c -o main.okdb.o:kdb.c def.h command.h        gcc -c kdb.c -o kdb.ocommand.o: command.c def.h command.h        gcc -c command.c -o command.oclean:        rm edit $(OBJS)

常见系统预定义的变量名


常见自动变量

利用系统变量名,修改上面的例子

OBJS=main.o kdb.o command.o CC = gccCFLAGS = -Wall -O -gedit:$(OBJS)        $(CC)  -o  $@  $^ main.o:main.c def.h         $(CC) $(CFLAGS) -c $< -o $@kdb.o:kdb.c def.h command.h         $(CC) $(CFLAGS) -c $< -o $@command.o: command.c def.h command.h        $(CC) $(CFLAGS) -c $< -o $@clean:        rm edit $(OBJS)

-Wall是显示90%的常用debug信息,-g是为了给gdb调试。-O用于控制优化等级参考http://hi.baidu.com/317264476/item/7aba3f9438df6935336eeb1a

可见利用自动变量,就可以简化Makefile编写,在存在大量文件时,不容易写错。


隐式规则

make默认.o文件由.c编译,因此上面的脚本可以简化为如下,直接省略了类似gcc -c hello.c -o hello.o的语句

OBJS=main.o kdb.o command.o CC = gccCFLAGS = -Wall -O -gedit:$(OBJS)main.o:main.c def.hkdb.o:kdb.c def.h command.hcommand.o: command.c def.h command.hclean:        rm edit $(OBJS)
常见隐式规则如下


make命令参数!

执行make时候还可以输入命令,常见命令参数如下



0 0
原创粉丝点击