zoukankan      html  css  js  c++  java
  • makefile中一些符号的含义

    关于gnu make的详细介绍参看http://www.gnu.org/software/make/manual/make.html
     
    规则
    让我们先来粗略地看一看Makefile的规则。
    target ... : prerequisites ...
    command
    ...
    ...
    目标:依赖
    执行指令 ...
    target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)。
    ① prerequisites就是,要生成那个target所需要的文件或是目标。
    ② command也就是make需要执行的命令。(任意的Shell命令)
    这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行(command一定要以Tab键开始,否则编译器无法识别command),减少重复编译,提高了其软件工程管理效率。
     
    部分符号:

    $@
    表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
    $%
    仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a (bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目标不是函数库文件(Unix下是[.a],Windows下是 [.lib]),那么,其值为空。
    $<
    依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
    $?
    所有比目标新的依赖目标的集合。以空格分隔。
    $^
    所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
    $+
    这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。
    $*
    这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么,"$*"的值就是"dir /a.foo"。这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么"$*"也就不能被推导出,但是,如果目标文件的后缀是 make所识别的,那么"$*"就是除了后缀的那一部分。例如:如果目标是"foo.c",因为".c"是make所能识别的后缀名,所以,"$*"的值 就是"foo"。这个特性是GNU make的,很有可能不兼容于其它版本的make,所以,你应该尽量避免使用"$*",除非是在隐含规则或是静态模式中。如果目标中的后缀是make所不 能识别的,那么"$*"就是空值。

    下面语句分析:

    makefile下$(wildcard $^),$^,$@,$?,$<,$(@D),$(@F)代表的不同含义

    $(filter-out $(PHONY) $(wildcard $^),$^)
    常用用法为$(wildcard *.c)
    表示列举当前目录下的所有.c文件
    这里$^因为会包含依赖的文件名,如果包含的该文件存在,那么将返回其含路径的文件名
    所以$(wildcard $^)就是用来过滤$^包含的所有文件并且该文件确实在本地存在.

    自动化变量$?代表依赖文件列表中被改变过的所有文件。
    自动化变量$^代表所有通过目录搜索得到的依赖文件的完整路径名(目录 + 一般文件名)列表。
    自动化变量$@代表规则的目标。
    自动化变量$<代表规则中通过目录搜索得到的依赖文件列表的第一个依赖文件。
    自动化变量$(@D)
    The directory part of the file name of the target,
    with the trailing slash removed. If the value of ‘$@’ is dir/foo.o
    then ‘$(@D)’ is dir. This value is . if ‘$@’ does not contain a slash.
    http://www.gnu.org/software/make/manual/make.html
    自动化变量$(@F)
    The file-within-directory part of the file name of
    the target. If the value of ‘$@’ is dir/foo.o then ‘$(@F)’ is foo.o.
    ‘$(@F)’ is equivalent to ‘$(notdir $@)’.

    -----------------------------------------------

    AR
    归档维护程序的名称,默认值为 ar。
    ARFLAGS
    归档维护程序的选项。
    AS
    汇编程序的名称,默认值为 as。
    ASFLAGS
    汇编程序的选项。
    CC
    C编译器的名称,默认值为 cc。
    CFLAGS
    C编译器的选项。
    CPP
    C 预编译器的名称,默认值为 $(CC) -E。
    CPPFLAGS
    C预编译的选项。
    CXX
    C++编译器的名称,默认值为 g++。
    CXXFLAGS
    C++编译器的选项。
    FC
    FORTRAN编译器的名称,默认值为 f77。
    FFLAGS
    FORTRAN编译器的选项。
  • 相关阅读:
    Hdu4547CD操作离线lca
    1036: [ZJOI2008]树的统计Count树链剖分
    light1348Aladdin and the Return Journey树链剖分
    Problem 2082 过路费树链剖分
    2243: [SDOI2011]染色树链剖分
    Poj3237Tree 树链剖分
    Poj2763Housewife Wind树链剖分
    Hdu5087Revenge of LIS II简单dp
    Hdu5088Revenge of Nim II高斯消元
    Bootstrap入门学习笔记(只记录了效果)
  • 原文地址:https://www.cnblogs.com/ydxt/p/5642331.html
Copyright © 2011-2022 走看看