zoukankan      html  css  js  c++  java
  • make编写教程(二)

    1. make中的变量

    makefile中的变量就是c/c++中的宏

    2. 引用其他的make文件

    类似于c语言中的#include,被包含的文件会原模原样的放在当前文件的包含位置。

    include<filename>,filename可以是当前操作系统shell的文件模式(可以包含路径和通配符)。例如,有多个文件,x.mk, y.mk, z.mk,还有文件child.mk,

    变量${var},该变量的值为p.mk, q.mk。

    对于如下语句:

    include *.mk child.mk ${var} 会被解析成:

    include x.mk y.mk z.mk child.mk p.mk q.mk

    3. 文件搜寻

    使用VPATH变量 告诉make在指定目录中寻找。

    VPATH=src:../headers  定义指定两个目录,src和../headers,make会按这个顺序进行搜索,目录由冒号分隔。

    关键字:vpath

    vpath <pattern> <directories> 为符合模式<pattern>的文件指定搜索目录<directories>

    vpath <pattern> 清除符合模式<pattern>的文件指定搜索目录

    vpath 清除所有被设置好了的文件搜索目录

    vpath使用方法中的<pattern>需要包含”%“字符,意思为匹配0或若干字符,如:

    vpath %.h ../headers 要求make在“../headers”下搜索所有以“.h”结尾的文件。

    可以连续使用vpath,指定不同的搜索策略。如果出现了相同的pattern,或是被重复了的pattern, make会按照vpath的先后顺序来搜索。

    vpath %.c d1

    vpath %.c d2

    vpath %.c d3

    表示结尾“.c”的文件,现在目录d1,然后d2,最后d3.

    4. 伪目标的具体用法

    .PHONY: clean

    用.PHONY来显示指明clean是一个伪目标,不管是否有这个文件。

    伪目标的依赖性:

    all: program1 program2 program3
    .PHONY: all
    
    program1: program1.o
        cc -o program1 program1.o
    
    program2: program2.o
        cc -o program2 program2.o
    
    program3: program3.o
        cc -o program3 program3.o

    Makefile中第一个目标会被作为默认目标,声明了一个“all”的伪目标后,其依赖于其他三个目标,伪目标的特性是总是会被执行的,所以其依赖的三个目标总是不如all这个目标新。

    5. 静态模式

    静态模式可以更加容易地定义多目标规则:

    <targets...>:<target-pattern>:<prereq-patterns...>

      <commands>

    targets定义了一系列的目标集合,可以有通配符,是目标的一个集合。

    target-pattern指明了targets模式,即是目标集的模式。

    prereq-patterns是目标的依赖模式,它对target-pattern形成的模式再进行以此依赖目标的定义。

    如果<target-pattern>定义成"%.o",意思是我们的集合中都是以".o"结尾的,而如果我们的<prereq-patterns>定义成"%.c",是对<target-pattern>所形成的目标集进行二次定义,计算方法是:取<target-pattern>模式中的"%"(去掉.o这个结尾),并为其加上.c这个结尾,形成的新集合。

    objs=program1.o program2.o
    all:$(objs)
    
    $(objs):%.o:%.c
        $(CC) -c $(CFLAGS) $< -o $@

    指明了目标从$objs中获取,“%.o”表明所有的以“.o”结尾的目标,而依赖模式“%.c”则去模式“%.o”的“%”,也就是program1,并为其加上".c"的后缀,则依赖目标就是“program1.c program2.c”,“$<”表示所有的依赖目标集,“$@”表示目标集。则上面的代码可扩展为以下代码:

    program1.o: program1.c
        $(CC) -c $(CFLAGS) program1.c -o program1.o
    
    program2.o: program2.c
        $(CC) -c $(CFLAGS) program2.c -o program2.o

    另外的例子:

    files=foo.elc bar.o lose.o
    
    $(filter %.o,$(files)):%.o:%.c
        $(CC) -c $(CFLAGS) $< -o $@
    
    $(filter %.elc,$(files)):%.elc:%.el
        emacs -f batch-byte-compile $<

    $(filter%.o,$(files))调用Makefile的filter函数,过滤"$filter"集。

  • 相关阅读:
    多目标遗传算法 ------ NSGA-II (部分源码解析)两个个体支配判断 dominance.c
    多目标遗传算法 ------ NSGA-II (部分源码解析)二元锦标赛选择 tourselect.c
    多目标遗传算法 ------ NSGA-II (部分源码解析)介绍
    遗传算法,实数编码的交叉操作之SBX(模拟二进制交叉)
    多媒体开发之wis-stream
    嵌入式驱动开发之--- 虚拟磁盘SBULL块设备驱动程序分析
    游戏开发之八卦图形生成
    目标跟踪之光流法---光流法简单介绍
    目标跟踪之高斯混合模型---cv实现
    嵌入式开发之davinci--- ipnc中用到的cmem
  • 原文地址:https://www.cnblogs.com/sssblog/p/9720102.html
Copyright © 2011-2022 走看看