Makefile write skill

Makefile 是大型项目开发必非常好的编译控制方法,makefile 的语法是有一些make file 语句和shell 命令构成的,说白了就是一些依赖和目标文件的相互之间的一种编译关系。下面我们举详细介绍一下makefile的写法和使用技巧。

1. 变量的声明和shell脚本一样没有类型的声明只有变量名的声明,例如 OBJS 

2. 一些 特殊符号的介绍:

    $ 变量引用符号, $@  目标文件,$< 文件夹下的第一个依赖文件, $^ 文件夹下的所有依赖文件

3. 一些常用的变量的介绍:

        OBJS= 所有目标

        CFLAGS=  编译选项,-O 优化的级别,O1 O2 O3  -fPIC 编译与位置无关的程序,-Wall 显示警告信息 -g gdb可调式选项

        INCLUDES= 头文件集合

        LIBS= 需要的依赖库的集合

 4. 一些简单常见的makefile 命令的介绍:

        include  xxx.mk include别的make file 文件。

        -I 指定include头文件搜素的路径, -i 指定include到某个具体的文件, -L 指定链接库的搜素路径,-l 连接到某个具体库文件名

       make -C 指定make执行的路径, 

       静态库生成命令 ar  rcvs libname.a  *.o  动态库生成命令 gcc -shared  -o libname.so  *.o

      export 关键字是修饰全局变量的全工程可用。

      @echo 输出不回显的输出(命令本身不会输出)

5. makefile中的for循环使用

      @for i in $(SUBDIR); do\

              make -C $$i || exit 1 ;\

          done

  6. make file中shell 命令的应用, 在makefile中shell命令必须在target 中出现否则是没有作用的,在makefile只能够每一行shell脚本就是一个独立的shell运行单元,所以要想在makefile中运行一组有联系的shell脚本必须在每个命令结束或加;\ 保证这些命令在一行内。还有在shell中传入makefile中的变量需要用$$ 

   7 . 虚拟目标的用法和作用

      .PHONY: clearn 

           rm -rf  $(targes)

        这个主要是防止同名产生冲突导致clean没法执行,因为make clean每次都会执行它没有依赖 也不生成clean文件每次都有跟新,但当有clean文件生成是由于没有依赖clean永远都是最新的不会执行clean命令,加上.PHONY 后表示忽略clean文件存在与否都会执行。

  8. 如何判断makefile中那些是shell命令呢

      其实每个target下的命令都是shell命令,make是依托于shell命令解释器的。下面关makefile中shell命令的应用我们做个详解:

      var = 3

       target: test1 test2

               echo $(var) ;\                                              step1

               var=4;\                                                          step2

               echo $(var) ;\                                               step3

               echo $$(var)                                                step4
首先要说明一点在makefile中无论是否是shell命令Makefile都会最先把 变量引用替换掉例  例如 会先把shell 命令中的$(var) 替换为3.在去执行行shell命令。明白这一点过后就不难得出step1~4的执行结果了。
     
         step1: 输出为3 因为在makefile替换过后就成了echo 3 的shell命令了;
         step2: 为空只是执行了一个shell变量声明命令,这个变量和makefile中的变量是不一样的虽然同名(一个是makefile变量一个为shell变量, shell变量=左右不能有空格
         step3: 输出为3在被makefile优先替换后输出的仍然是makefile变量。
         step4: 输出为4 在被makefile替换后为echo  $(var) shell命令输出为shell变量。
9. Makefile 中 开关语句 属于makefile 本身的只有 ifeq ... endif 组合,这里是把shell 中的 if for switch 除外。 
          ifeq ($(var), y)
           make 
          endif
10. Makefile中的 变量定义
        单行变量: 需要全工程的 export  VAR 
                            不需要全工程的  VAR
        多行变量定义(也就是函数定义): 指的是一个变量代表一个表达式 或多行替代 这里就要用到define 关键字
            define   VAR
              xxxx
              yyyy
            endef
有以上可以总结出makefile中使用shell命令的注意事项有:
          1. makefile中shell命令只 能单独在target中使用 或者 $(shell,command)强行调用shell脚本。
           2. makefile会 最先替换掉shell中有关makefile的变量
           3. makefile中的 每一行是一个独立的shell运行单元 (就是每一行就是一个shell进程,相互之间没有依赖和交互性)
       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值