IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    关于Makefile

    Qiang发表于 2009-08-11 04:19:36
    love 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中的值。



沪ICP备19023445号-2号
友情链接