• Make文件(一)


    基本规则

    目标:依赖

    (tab)规则

    目标:需要生成的目标文件

    依赖:生成该目标所需的一些文件

    规则:由依赖文件生成目标文件的手段

    tab:每条规则前必须以tab开头,使用空格不行。 

    例如:

    /**
    test.c
    **/
    #include<stdio.h>
    int main()
    {
        printf(“this is test
    ”);
        return 0;
    }

    终端编译就是:gcc test.c -o test 

    换成Makefile文件就是

    test:test.c
        gcc test.c -o test

    其中第一行的test就是要生成的目标,test.c 就是依赖项,第二项就是由test.c生成的test的规则。

    Makefile可以生成多个目标,但是Makefile会将第一个目标定为终极目标。

    普通变量:

    变量定义以及赋值:

    变量直接采用赋值的方法即可完成定义;如:

    INCLUDE = ./include/

    变量取值:

    用括号括起来再加一个美元符,如:

    FOO = $(OBJ)

    系统自带变量:

    通常都是大写,比如CC,PWD,CFLAG,等等。

    有些有默认值,有些则没有,比如:

    CPPFLAGS:预处理器需要的选项 如:-I

    CFLAGS:编译的时候使用参数 -Wall -g -c

    LDFLAGS:链接库使用的选项 -L -I

    变量的默认值可以被修改,比如CC的默认值是cc,但是可以修改为CC = gcc

    自动变量:

    常用的自动变量:

    系统提供了很多自动变量,但常用的就是与以下三个,这些自动变量只能在规则中使用,其他地方不能使用。

    $@ à规则中的目标

    $< à规则中的第一个依赖项

    $^ à规则中所有的依赖性

    例如:

    app:main.c fun1.c fun2.c
        gcc $^ -o $@

    其中:$^表示main.c fun1.c fun2.c,$< 表示main.c , $@ 表示app

    模式规则:

    模式规则是在目标及依赖条件中使用%来匹配对应的文件,比如在目录下有main.c,fun1.c,fun2.c 三个文件,对这三个文件的编译可以由一条规则完成。

    %.o : %.c
        $(CC) -c $< -o $@

    这条模式规则表示:

    main.o 由main.c 生成

    fun1.o 由fun1.c 生成

    fun2.o 由fun2.c 生成

    这就是模式规则的作用,可以一次匹配目录下所有的文件。

    函数:

    makefile也为我们提供了大量的函数,同样经常使用到的函数为以下两个。

    wildcard:

    用于查找指定目录下指定类型的文件,跟的参数就是目录+文件类型,比如:

    src = $(wildcard ./src/*.c)

    这句话表示,找到./src目录下的所有文件后缀为.c的文件,并赋值给变量src

    命令执行完毕后,src的值就是main.c fun1.c fun2.c

    patsubst

    匹配替换,例如以下例子,用于从src目录中找到所有的.c结尾的文件,并将其替换为.o文件,并赋值给obj

    obj = $(patsubst %.c , %.o ,$(src))

    将src变量中所有后缀为.c文件替换成.o

    命令执行完成后,obj的值为main.o fun1.o fun2.o

    特别的,如果想把.o文件放在obj目录下,可以用以下方法:

    ob = $(patsubst ./src/%.c, ./obj/%.o, $(src))

    makefile文件中所有的函数都必须有返回值。

    #make all 执行生成可执行文件
    #1编译器 2编译选项 3输出 4生成的可执行文件 5需要的源文件 6需要当库文件

  • 相关阅读:
    算法提高 11-2删除重复元素
    Codeforces 402 D Upgrading Array
    Codeforces 351B Jeff and Furik
    湖南多校对抗赛(2015.03.28) I Inversion Sequence
    湖南多校对抗赛(2015.03.28) H SG Value
    湖南多校对抗赛(2015.03.28) G Good subsequence
    湖南多校对抗赛(2015.03.28) E Longest Increasing Subsequence Again
    湖南多校对抗赛(2015.03.28) B Design road
    湖南多校对抗赛(2015.03.28) A Rectangle
    Codeforces 515D Drazil and Tiles
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11068417.html
Copyright © 2020-2023  润新知