最新消息:

关于Makefile

C/C++ admin 2782浏览 0评论

在LINUX下开发,如果不会用Makefile,那是一件多么可笑的事!

以前只学了一些Makefile的最最基础的知识,今天又在《Linux c 编程一站式学习》中看到了Makefile的用法,于是下定决心把自己的Makefile提高一个档次。

  • 关于隐含规则

如果一个目标在Makefile中的所有规则都没有命令列表,make 会尝试在内建的隐含规则(Implicit Rule)数据库中查找适用的规则。make 的隐含规则数据库可以用make -p命令打印,打印出来的格式也是Makefile的格式,包括很多变量和规则。

  • 关于变量

“=”的好处是我们可以把变量的值推迟到后面定义,但是不合理的定义可能会造成死循环而导致make退出。

“:=”可以在变量定义时立即展开

还有一个比较有用的赋值运算符是?=,例如foo ?= $(bar)的意思是:如果foo 没有定义过,那么?=相当于=,定义foo 的值是$(bar),但不立即展开;如果先前已经定义了foo ,则什么也不做,不会给foo 重新赋值。

“+=” 运算符可以给变量追加值。

  • 关于特殊变量

$@ ,表示规则中的目标。

$< ,表示规则中的第一个条件。

$?,表示规则中所有比目标新的条件,组成一个列表,以空格分隔。

$^ ,表示规则中的所有条件,组成一个列表,以空格分隔。

例如前面写过的这条规则:
main: main.o stack.o maze.o
gcc main.o stack.o maze.o -o main
可以改写成:
main: main.o stack.o maze.o
gcc $^ -o $@

  • 常用的make 命令行选项

-n选项只打印要执行的命令,而不会真的执行命令,这个选项有助于我们检查Makefile写得是否正确,由于Makefile不是顺序执行的,用这个选项可以先看看命令的执行顺序,确认无误了再真正执行命令。

-C选项可以切换到另一个目录执行那个目录下的Makefile。

在make 命令行也可以用=或:=定义变量,如果这次编译我想加调试选项-g,但我不想每次编译都加-g选项,可以在命令行定义CFLAGS变量,而不必修改Makefile编译完了再改回来:
$ make CFLAGS=-g
cc -g   -c -o main.o main.c
cc -g   -c -o stack.o stack.c
cc -g   -c -o maze.o maze.c
gcc main.o stack.o maze.o -o main
如果在Makefile中也定义了CFLAGS变量,则命令行的值覆盖Makefile中的值。

转载请注明:爱开源 » 关于Makefile

您必须 登录 才能发表评论!