- 论坛徽章:
- 0
|
Makefile编写
编译:将源码编译成.o文件
链接:将多个.o文件合并成可执行文件
例,工程中有8个C文件,3个头文件
编译规则:
如果这个工程没有编译过,那么所有的C文件都要编译并链接
如果某几个C文件被修改,则只编译被修改的文件,并链接目标程序
如果头文件被更改了,则编译引用了该头文件的C文件,并链接目标程序
vi 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
kdb.o:kdb.c defs.h command.h
cc -c kdb.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:utils.c defs.h
cc -c utils.c
clean:
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
目标:依赖关系
编译命令
使用变量
objects=main.o kdb.o command.o display.o insert.o search.o files.o utils.o
引用变量
$(objects)
例:
rm edit $(objects)
自动推导
GNUmake可以自动推导文件以及文件依赖关系后面的命令
如果make找到一个.o文件,它会自动把.c文件加入到依赖文件中,并用cc -c *.c 也会被推导出来
这样可以简化makefile的写法
vi makefile
objects=main.o kdb.o command.o display.o insert.o search.o files.o utils.o
edit:$(objects)
cc -o edit $(objects)
main.o:defs.h
kdb.o:defs.h command.h
comamnd.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
clean:
rm edit $(objects)
另类更简易的写法
vi makefile
objects=main.o kdb.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)
清除目标文件规则
.PHONY:clean
clean:
-rm edit $(objects)
减号表示如果某些文件出现问题也不管继续执行后续命令
指定非正规的makefile文件名
make -file make.linux //短选项
make --file make.linux //长选项
包含其它makefile文件
include filename
例:
bar=a.mk b.mk c.mk
include foo.make *.mk $(bar)
显示命令
@ 正在编译X模块...
命令执行
当上一行命令的执行要应用在下一行时必须写在同一行上用分号分隔
exec:
cd /home/guest;pwd
忽略错误继续执行
1.在命令行前加-(减号)
2.给make加参数-i(--ignore-errors)
嵌套执行makfile
各分目录有自己的makefile,总控目录有一个makefile管理着所有的makefile文件
subsystem:
cd subdir && $(MAKE)
$(MAKE)宏变量的意义在于我们可以指定make的一些参数
传递变量到下级makefile中
export 变量
不想传递变量到下级makefile中
unexport 变量
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/56374/showart_446530.html |
|