欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Makefile的宏

程序员文章站 2022-03-15 22:23:42
...

Makefile的宏分为俩种:普通的宏和特殊的宏

  • 普通的宏:

    Makefile中普通的宏类似于变量。可以使用类似于下例的方式来定义:

    MACROS  = -me         #后续需要使用 -me时 可以使用 MACROS 与一些运算符进行配合使用
    #例如:
    $(MACROS)             #主要用于增加代码的可读性
    PSROFF  = groff -Tps
    DITROFF = groff -Tdvi
    CFLAGS  = -O -systype bsd43       
    LIBS    = "-lncurses -lm -lsdl"    #编译当中使用了哪些库 也可以使用宏来进行替换,
    																	 #这样就大大的减少了代码的复杂度,让代码更加容易理解。
    LIBS   += -lstdc++                 #可以使用运算往宏的内容中追加内容
    MYFACE  = ":*)"
    #使用示例
    $(MYFACE)   #增加了可阅读性  Myface(笑脸) = ":*)" 可以放其他使用者很快的明白其中的意义
    
    #宏可以随意命名
    #例如:
    PROJ_HOME = /home/lavendercc/projects      #使用宏来替换具体路径,同样增加了代码的可读性
                                              #同时也减少了代码的复杂度
    
    #调用方法  $(宏的名称)
    #例如:
    $(PROJ_HOME)       
    

注意点:一旦宏被定义了,在这个宏之前同名的定义都将作废。

  • 特殊的宏

    在目标规则集发出任何命令之前,有一些特殊的宏

[email protected]   #表示目标文件
$?   #表示比目标文件还要新的依赖文件列表

可以使用下面一个例子来测试一下:

hello: main.cpp hello.cpp factorial.cpp
        $(CC) $(CFLAGS) $? $(LDFLAGS) -o [email protected]
#hello                                 编译生成的执行文件名
#main.cpp hello.cpp factorial.cpp      编译所需要的条件(文件)
#$(CC) $(CFLAGS) $? $(LDFLAGS) -o [email protected]   编译所要执行的规则
#[email protected] 代替的 hello 这个目标文件   CC表示进行的是 C++ 的编译
#$? 会将所需要的条件(文件)按顺序填入(如果其中有文件的修改时间比目标文件更新,
                   #则修改时间比目标文件旧的文件不会被编译,修改时间比目标文件新的会进行编译
alternatively:

hello: main.cpp hello.cpp factorial.cpp
        $(CC) $(CFLAGS) [email protected] $(LDFLAGS) -o [email protected]
#[email protected] 将hello 下面所依赖的 .cpp文件全部进行编译
                   #(不存在时间筛选,每次编译时都会将全部 .cpp文件都再次编译一次)

常用的一些特殊的宏:

#俩个特殊的隐含规则中使用的宏
$<   #表示第一个依赖文件
$*   #这个变量表示目标模式中 "%"及其之前的部分
#注意点:如果目标模式是Make工具可以天然识别的模式可以不需要 %符号也可以进行识别

#例如:
#对于$* 如果目标是"dir/a.foo.b",并且目标模式是"a.%.b",那么"$*"的值就是"dir/a.foo"
                                                                  #(%之前的所有文件)。
#如果目标中没有模式的定义,那么"$*"也就不能被推导出,但是,如果目标文件的后缀是Make所识别的,
   #那么"$*"就是除了后缀的那一部分。
#例如:
#如果目标是 "foo.c",因为".c"是Make所能识别的后缀名,所以"$*"的值就是"foo"
#这个特性是GNU make的,很有可能不兼容于其他版本的make,所以应该尽量避免使用"$*",
#除非在隐含规则或是静态模式中。如果目标中的后辍是make所不能识别的,那么"$*"就是空值。
#使用示例:
.o.cpp:
	     $(CC) $(CFLAGS) -c $<
#常见的隐含规则的构造 .o(对象)文件 , .cpp(源文件)
#$< 相当于  main.cpp ==   $*.cpp
alternatively:

.o.cpp:
	     $(CC) $(CFLAGS) -c $*.cpp

  • 传统的宏

          在Makefile中有许多传统的默认宏(输入”make -p“打印出来的默认值)。大多数情况下它们使用的规则是很明显的:
    
         这些预定义变量,即:在隐含规则中使用的宏分为俩大类:
    
    • 程序名(例如CC)
    • 含有参数的程序(如CFLAGS)

下面是一些比较常见的变量用作内置规则:makefile文件的程序名称的表

Untitled

注:可以取消 ‘-R’或 “—no-builtin-variables”选项隐含规则使用的所有变量。

//例如
  make CPP = /home/lavendercc/projects