Makefile的笔记

  Makefile 简单的规则用法实现作用这里就不讲了,一搜一大把,这里记录了一些遇到的Makefile中一些可能碰到的变量函数之类的。

一、Makefile 变量

  1.1、 自定义变量

   Makefile中定义自定义变量,不需要声明数据类型,只需要定义名字,因为在Makefile中,所有的变量都默认是字符串类型。

   1、变量规定

    a)变量命名规则和c语言一致。

         b)变量赋值,和c一致,可以有空格,也可以没有空格

 A=lx等效  A = lx

    c) 因为变量都是字符串,所以””可以省略

A= “hello” 等效 A = hello

   2、 变量的引用

  引用变量的时候,需要在变量前边加上一个$

  Makefile引用变量时,需要给变量加上一个() 

A= hello B=$(A) world

  3、系统与设定变量

  系统中已经写好了,并且附好了值

  例子: CC  -> 编译器名字, 默认等于 cc  cc等价于gcc CC=gcc

        RM  -> 删除命令     默认 等于 rm –f            RM=rm –f

  如果不赋值就按默认值处理,如果你修改了,就按新的值处理。

 1.2Vpath 变量

    VPATH:所有依赖的搜寻路径

    如果一个作为目标或依赖的文件在当前目录中不存在, make就会在VPATH指定的目录中搜寻该文件 VPATH变量定义中,目录的名字由冒号或空格分开。目录列举的次序也是make 搜寻的次序。

    VPATH = src:../headers

    指定了两个目录,‘ src’‘…/headers’make也按照这个次序进行搜寻

    foo.o : foo.c就等效于foo.o : src/foo.c

  1.3、 自动化变量

       变量的值不固定,变化的

    $^   ->代表所有的依赖

    $@  ->代表所有的目标

    例子   gcc  $^ -o  $@

二、Makefile 伪指令

  适用情景:

  假设Makefile中有规则:

clean:
  $(RM) bin/test

  场景二:假设Makefile中有规则:且当前目录下有一个目录名字叫做 clean/:

clean:
  $(RM) bin/test

   当我们执行make clean时:

    会出现make : ‘cleanis up date ”,他会将clean当成目标,所以不会执行clean操作。

  此时我们需要增加伪指令

.PHONY:clean
clean:   $(RM) bin
/test

三、Makefile 函数 

3.1wildcard 函数

  功能:在指定的路径下寻找匹配的文件。

  C语言函数调用   函数名(参数1,参数2,…)

  Makefile函数调用: $(函数名  参数1,参数2,…)

例子:把当前目录下的所有.c名字找出来,并且将文件名保存到一个变量

  C_SOURCE = $(wildcard  ./*.c)

3.2patsubst函数

作用:修改文件的后缀,并将这些改完的名字放置到一个变量。相当于提取的名字,然后改名字然后赋值给变量

lx.c   ->   lx.o

例子:把当前目录下的所有.c编译成动态库。

C_SOURCE = $(wildcard  ./*.c)  /*当前所有的文件名赋值给C_SOURCE*/
LIB_PATH=./liblx.so.1.1
OBJ=$(patsubst %.c ,%.o,$( C_SOURCE))  /*把C_SOURCE里的文件,只要是.c结尾的,就替换成.o的文件名*/
$( OBJ):$( C_SOURCE)
    $(CC) &^ -o $@  -c fPIC
$(LIB_PATH):$(OBJ)
    $(CC) fPIC shared –o $@ $^

 

posted @ 2020-12-11 14:48  lxblog  阅读(128)  评论(0编辑  收藏  举报