zoukankan      html  css  js  c++  java
  • makefile 使用 Tricks

    • .phony是表示目标是伪目标,并不生成相应的文件。.phony标志的文件总是执行的。

    1. 短横(-)与@

    • @(常用在 echo 之前):make 在执行编译打包等命令前会在命令行输出此命令,称之为回显,如果要执行的命令前以字符@开始,则不会回显该条命令,

      echo XXX...
      
      # 执行该条命令时,将输出:
      
      
      echo XXX...
      XXX...
          # 不仅会输出echo要输出的信息(XXX...),还会输出echo这一命令信息
      
      @echo XXX...
      
      # 执行命令时,将输出:
      
      XXX...
          # 不会输出echo命令
    • -短横(用在 clean 目标, rm 命令前),忽略本条命令的执行成功与否,会继续执行后续命令,类似于 try catch finally 的 finally 代码段

      clean:
          rm *.o
          rm *.a
      如果 rm *.o 命令发生错误,rm *.a 将不会被执行,
      
      clean:
          -rm *.o
          -rm *.a

      不论 -rm .o,是否执行成功,-rm .a 都会被执行;

    2. 特殊符号

    • $@, $^, $<
      • $@ 代表目标
      • $^ 代表所有的依赖对象
      • $< 代表第一个依赖对象
    • =/:=/+=

      • +=:变量的值的尾部增加内容
      foo = abc
      foo += efg
          # foo 的值就是 abc efg
      • :=:立即生效;=:变量被引用时递归生效;
      bar=456
      foo=${bar}
      bar=${xxx}
      xxx=123
      
      all:
         echo ${foo}          # 递归生效,echo 显示的内容为123
      bar=456
      foo:=${bar}
      bar=${xxx}
      xxx=123
      
      all:
         echo ${foo}
             # 立即生效,echo 显示的内容为 456

    3. all

    all : hello another
    
    hello : hello.cpp
        g++ -o $@ $<
    
    another : another.cpp
        g++ -o $@ $<
    
    • make hello 的话只编译 hello.cpp
    • make another 的话只编译 another.cpp
    • 直接 make 或 make all 的话会执行 hello.cpp 和 another.cpp 的编译命令
    • 后面不加参数的话,会把第一个目标作为默认的(因此,make 等价于 make all,因为 all 为第一个目标)
  • 相关阅读:
    东边日出西边雨
    ZooKeeper学习(一)了解ZooKeeper
    linux学习(七)文件打包和压缩命令
    linux学习(六)Linux yum 命令
    linux学习(五)Linux 文件与目录管理
    linux学习(四)Linux 文件基本属性
    linux学习(三)Linux 系统目录结构
    linux学习(二)认识Linux
    linux学习(一)认识阿里云
    多线程实战【面试题形式】
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9420974.html
Copyright © 2011-2022 走看看