makefile简介
当然在我们做一个大型开发是不可能一个一个的GCC去,这个时候我们的makefile就派上用场了。
GNU的make能够使整个软件工程的编译、链接只需要一个命令就可以完成。所以程序员必须得会makeflie。
make在执行时,只需要一个名为makefile(Makefile)的文件。makefile文件描述了整个工程的编译,链接等规则。其中包括:工程中的那些源文件需要编译以及如何编译;需要创建那些库文件以及如何让创建这些库文件、最后产生我们想要得到的可执行文件。
makefile规则示例
hello:main.o func1.o func2.o
gcc main.o func.o func2.o -o hello
main.o:main.c
gcc -c main.c
func1.o:func1.c
gcc -c func1.c
func2.o:func2.c
gcc -c func2.c
.PHONY:clean
clean:
rm -f hello main.o func1.o func2.o
规则:用于说明如何产生一个或多个目标文件,规则格式如下:
targets:prerequisities
command
目标:依赖
命令 //命令需要以【Tab】键开始//
在makefile中,规则的顺序很重要,因为makefile中只应该有一个最终目标,其他的目标都是这个目标所带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在makefile中的目标可能会有很多,但是第一条规则种的目标将被确立为最终目标。
文件名
makefile命令默认在当前目录下寻找名字为makefile 或者Makefile的工程文件,当名字不为这两者之一时,可以使用:
make -f 文件名 的命令。
伪目标
makefile中把那些没有任何依赖只有执行动作的目标称为“伪目标(phony targets)”
如上面例子中
.PHONY:clean
clean:
rm -f hello main.o func1.o func2.o
“.PHONY”将“clean”目标声明为伪目标变量
当有大量重复性修改时我们可以使用变量。
例子:
obj=
hello:$(obj)
gcc
$(obj) -o hello
在makefile中,存在系统默认的自动化变量
$^:代表所有依赖文件
$@:代表目标
$<:代表第一个依赖文件。
例:
hello:main.o func1.o func2.o
gcc main.o func.o func2.o -o hello
可以改写为:hello:main.o func1.o func2.o
gcc $^ -o $@
杂项
makefile中“#”字符后的内容被视作注释
hello:main.o func1.o func2.o
@gcc main.o func.o func2.o -o hello
@:取消回显