zoukankan      html  css  js  c++  java
  • Makefile的学习

    1、 Makefile的定义

    •  ?=若变量未定义,则定义;+=在变量后面追加;:=和=均为赋值符号(其中,=是最基本的赋值,会将Makefile全部展开后决定对应的值,而:=表示变量的值取决于当前在Makefile里面的位置)。
    •  Makefile里面的一些控制语句记得敲空格,小括号里面不能加空格(这个和sheel不一样);想调用shell脚步赋值,可以这样写PWD := $(shell pwd).

              总结:Makefile和sheel脚步有很多类似之处(比如=号赋值),当然了也是有比较多的区别的,

              区别总结如下:

                 ①、makefile里面取变量值可以是$()和$[],如果是单个字符可以$a。但在sheel中意义不一样了,$var和${var}没有什么不一样,但后者有更精确的名空间,最关键的区别是$()会命令替换,有些类似于反引号。

    2、 Makefile的规则

        make命令执行时,需要一个Makefile文件,以用来告诉make命令需要怎么样去编译和链接,规则是:

    •    如果这个工程没有编译过,那么所有的c文件都要编译并链接。
    •    如果这个工程的c文件被修改过,那么我们只编译被修改过的c文件,并链接目标程序。
    •    如果这个工程的头文件被改变了,那么我们只需要编译引用这个头文件的c文件,并编译链接。(具体怎么知道头文件修改了,需要在编译时把头文件列出来)

    3、 Makefile的通配符

       wildcard扩展通配符:SOURCE += $(wildcard *.c)获取工作目录下的所有.c文件。

       patsubst替换通配符:OBJECTS = $(patsubst %.c,%.o,&(SOURCE)或者OBJECTS = $(SOURCE:%.c=%.o)

       通配符通常发生在以下时刻:

    •    在规则的目标、依赖中的通配符,make在读取Makefile时自动为其进行匹配处理(即展开),规则是由make去管理的。
    •    在规则的命令中的通配符不需要make来操心,它们总是由shell来展开。
    •     除了上面两点之外的其他地方(如变量定义),不能直接使用统配符,只能通过wildcard来达到目的,得到以后就可以用静态模式了。

     4、 Makefile的静态模式

         其中%.c到%.o是通配符转换,其中在实际编码时target可以是不需要的。

     

  • 相关阅读:
    JAVA序列化
    python教程
    原来root用户只有本地的权限,需要手动将远程的权限打开,尝试了好几种方法,最后还是下面这种方法管用
    MYsql开启远程连接
    雅虎36条优化准则
    需要学习的技术
    可用的谷歌地址
    propertype和_proto_分析
    mvn 插件
    通过 api 调用检查具体日期是否为法定节假日
  • 原文地址:https://www.cnblogs.com/kwdeblog/p/13210056.html
Copyright © 2011-2022 走看看