zoukankan      html  css  js  c++  java
  • 07makefile文件

    makefile

    • 规则:
    目标: 依赖
    (tab)命令
    

    第一个版本:

    main: main.c fun1.c fun2.c sum.c
    	gcc -o main main.c fun1.c fun2.c sum.c
    

    第二个版本:

    检查规则:
    	要想生成目标文件, 先要检查依赖条件是否都存在:
    		若都存在, 则比较目标时间和依赖的时间, 如果依赖的时候比目标的时间新,
    		则重新生成目标; 否则不重新生成
    		若不存在, 则往下找有没有生成依赖的规则, 有则生成, 如果没有则报错.
    
    • 例子
    main:main.o fun1.o fun2.o sum.o
    	gcc -o main main.o fun1.o fun2.o sum.o
    
    main.o:main.c
    	gcc -o main.o -c main.c -I./
    
    fun1.o:fun1.c
    	gcc -o fun1.o -c fun1.c
    
    fun2.o:fun2.c
    	gcc -o fun2.o -c fun2.c
    
    sum.o:sum.c
    	gcc -o sum.o -c sum.c
    

    第三个版本:

    普通变量

    *	变量定义直接用 =
    *	使用变量值用 $(变量名)
    如:下面是变量的定义和使用
    foo = abc			// 定义变量并赋值
    bar = $(foo)		// 使用变量, $(变量名)
    定义了两个变量: foo、bar, 其中bar的值是foo变量值的引用。
    除了使用用户自定义变量, makefile中也提供了一些变量(变量名大写)供用户直接使用, 我们可以直接对其进行赋值:
    CC = gcc #arm-linux-gcc
    CPPFLAGS : C预处理的选项 -I
    CFLAGS:   C编译器的选项 -Wall -g -c
    LDFLAGS :  链接器选项 -L  -l
    

    自动变量

    *	$@: 表示规则中的目标
    *	$<: 表示规则中的第一个条件
    *	$^: 表示规则中的所有条件, 组成一个列表, 以空格隔开, 如果这个列表中有重复的项则消除重复项
    
    特别注意:自动变量只能在规则的命令中使用.
    

    模式规则

    至少在规则的目标定义中要包含’%’, ‘%’表示一个或多个, 在依赖条件中同样可以使用’%’, 依赖条件中的’%’的取值取决于其目标:
    比如: main.o:main.c  fun1.o: fun1.c  fun2.o:fun2.c, 说的简单点就是: xxx.o:xxx.c
    
    变量: 
        自定义变量: var = hello, $(var)
        自带变量: CC CPPFLAGS CFLAGS LDFLAGS
        自动变量: $@ $< $^
    模式规则:
        %.o:%.c------> 前后的%必须是相同 
    
    • 例子:
    target=main
    object=main.o fun1.o fun2.o sum.o
    CC=gcc
    CPPFLAGS=-I./
    
    $(target):$(object)
    	$(CC) -o $@ $^
    
    %.o:%.c
    	$(CC) -o $@ -c $< $(CPPFLAGS) 
    
    #main.o:main.c
    #	gcc -o main.o -c main.c -I./
    #
    #fun1.o:fun1.c
    #	gcc -o fun1.o -c fun1.c
    #
    #fun2.o:fun2.c
    #	gcc -o fun2.o -c fun2.c
    #
    #sum.o:sum.c
    #	gcc -o sum.o -c sum.c
    

    第四个版本:

    1.wildcard – 查找指定目录下的指定类型的文件
    src=$(wildcard *.c)  //找到当前目录下所有后缀为.c的文件,赋值给src
    2.patsubst – 匹配替换
    obj=$(patsubst %.c,%.o, $(src)) //把src变量里所有后缀为.c的文件替换成.o
    
    如: 当前目录下有a.c b.c c.c
        src=$(wildcard *.c) -----> src=a.c b.c c.c
        obj=$(patsubst %.c,%.o, $(src)) -----> obj=a.o b.o c.o
    
    • 例子
    src=$(wildcard ./*.c)
    object=$(patsubst %.c, %.o, $(src))  # 将.c文件替换成.o文件
    
    # object=main.o fun1.o fun2.o sum.o
    
    target=main
    CC=gcc
    CPPFLAGS=-I./
    
    $(target):$(object)
    	$(CC) -o $@ $^
    
    %.o:%.c
    	$(CC) -o $@ -c $< $(CPPFLAGS)
    
    #main.o:main.c
    #	gcc -o main.o -c main.c -I./
    #
    #fun1.o:fun1.c
    #	gcc -o fun1.o -c fun1.c
    #
    #fun2.o:fun2.c
    #	gcc -o fun2.o -c fun2.c
    #
    #sum.o:sum.c
    #	gcc -o sum.o -c sum.c 
    

    第五个版本:

    增加清理功能.
    	终极目标: makefile文件中第一次出现的目标叫做终极目标
    	.PHONY:clean
    	clean:
    		rm -f ....
    		
    	使用-f可以指定makefile文件, 如: make -f mainmak
    
        总结:
            如果不需要取别名
            可以先make clean
            然后make生成可执行文件
    
    • 例子
    src=$(wildcard ./*.c)
    object=$(patsubst %.c, %.o, $(src))
    
    # object=main.o fun1.o fun2.o sum.o
    
    target=main
    CC=gcc
    CPPFLAGS=-I./
    
    $(target):$(object)
    	$(CC) -o $@ $^
    
    %.o:%.c
    	$(CC) -o $@ -c $< $(CPPFLAGS) 
    
    .PHONY:clean
    clean:
    	-rm -f $(target) $(object)
    
    #main.o:main.c
    #	gcc -o main.o -c main.c -I./
    #
    #fun1.o:fun1.c
    #	gcc -o fun1.o -c fun1.c
    #
    #fun2.o:fun2.c
    #	gcc -o fun2.o -c fun2.c
    #
    #sum.o:sum.c
    #	gcc -o sum.o -c sum.c 
    
  • 相关阅读:
    TextView autoLink不识别大写url问题
    用ImageLoader取拍摄的照片到imageView里面 图片的方向不对问题
    android使用qrcode_swetake.jar生成二维码
    jenkins + Git 搭建持续集成环境
    win10+jenkins+git+自动发布(搭建+构建)
    springMvc项目配置步骤
    linux系统下安装Jenkins
    解决java compiler level does not match the version of the installed java project facet
    Java通过FTP服务器上传下载文件的方法
    Nexus 安装(Linux 环境)
  • 原文地址:https://www.cnblogs.com/zranguai/p/15056237.html
Copyright © 2011-2022 走看看