zoukankan      html  css  js  c++  java
  • Linux命令(十三)make_makefile基础

    1. 好处

    一次编写,终身受益

    2. 命名规则

    • makefile

    • Makefile

    3. 三要素

    • 目标

    • 依赖

    • 规则命令

    4. 第一版makefile

    目标:依赖
    tab键 规则命令

    makefile:

    5. 第二版makefile

    第一版更改其中一个文件,所有源码都重新编译

    5.1 改进

    • 可以考虑编译过程分解,先生成 .o 文件,然后使用 .o 文件变成结果

    5.2 定义变量

    Makefile隐含规则:默认处理第一个目标

    5.3 函数

    • wildcard:可以进行 文件匹配

    • patsubst:内容的替换

    # get all .c file
    SrcFiles=$(wildcard *.c)
    
    
    # ObjFiles 定义目标文件
    ObjFiles=main.o add.o minu.o mul.o
      
    
    # 目标文件用法         
    app.out:$(ObjFiles)    
            gcc -o app.out -I./include *.o
      
    main.o:main.c          
            gcc -c main.c -I ./include
      
      
    add.o:add.c
            gcc -c add.c -I ./include
    
    
    minu.o:minu.c
            gcc -c minu.c -I ./include
    
    
    mul.o:mul.c
            gcc -c mul.c -I ./include
    
    test:
            echo $(SrcFiles)

    5.4 makefile变量

    • $@: 代表 目标

    • $^ :  代表全部 依赖

    • $< :  第一个依赖

    • $? :  第一个变化的依赖

    # get all .c file
    SrcFiles=$(wildcard *.c)
    
    # all .c files ---> .o files
    ObjFiles1=$(patsubst %.c,%.o,$(SrcFiles))
    
    # 目标文件用法
    app.out:$(ObjFiles1)
            gcc -o app.out -I./include $(ObjFiles1) 
    
    %.o:%.c
            gcc -c $< -I ./include 
    test:
    echo $(SrcFiles) echo $(ObjFiles1)

    5.5 添加清理功能(@在规则前作用)

    # get all .c file
    SrcFiles=$(wildcard *.c)
    
    # all .c files ---> .o files
    ObjFiles1=$(patsubst %.c,%.o,$(SrcFiles))
      
      
    # 目标文件用法         
    app.out:$(ObjFiles1)   
            gcc -o app.out -I./include $(ObjFiles1) 
      
    
    # 模式匹配规则, $@,$<这样的变量,只能在规则中出现
    %.o:%.c
            gcc -c $< -I ./include -o $@ 
    
    test:
            echo $(SrcFiles)
            echo $(ObjFiles1)
    
    # 添加清理功能
    clean:
            @rm -f *.o     # 加 @表示指令不输出
            rm -f app.out

    5.6 “-”的作用

    该条规则报错,仍然继续执行

    5.7 防止有歧义, 定义伪目标

    .PHONY:clean   # clean是一个伪目标,不是真正要得到的目标

    5.8 总结

    # get all .c file
    SrcFiles=$(wildcard *.c)
    
    # all .c files ---> .o files
    ObjFiles1=$(patsubst %.c,%.o,$(SrcFiles))
    
    all:app.out
    
    # 目标文件用法 $@: 目标;$<: 依赖
    app.out:$(ObjFiles1)
            gcc -o $@ -I./include $(ObjFiles1) 
    
    app.out1:$(ObjFiles1)
            gcc -o $@ -I./include $(ObjFuiles1)
    
    # 模式匹配规则, $@,$<这样的变量,只能在规则中出现
    %.o:%.c
            gcc -c $< -I ./include -o $@ 
    
    test:
            echo $(SrcFiles)
            echo $(ObjFiles1)
    
    # 定义伪目标,防止有歧义
    .PHONY:clean
    
    # 添加清理功能
    clean:
            -@rm -f *.o     # 加 @表示指令不输出
            rm -f app.out

    make  -f   xxx:指定文件 

  • 相关阅读:
    DataNucleus Access Platform 3.2 M2 发布
    dnsjava 2.1.4 发布,Java 的 DNS 解析包
    deltasql 1.5.5 发布,数据库模型版本控制
    Mezzanine 1.3 和 Cartridge 0.7 发布!
    Spring Framework 3.2 GA版发布,Spring MVC焕然一新
    Filemonitor 2.2.0 发布,文件监控工具
    Rudiments 0.40 发布,C++ 常用工具包
    脚本编程语言 Felix
    JRuby 1.7.2 发布
    OfficeFloor 2.7.0 发布,IoC 框架
  • 原文地址:https://www.cnblogs.com/douzujun/p/10568893.html
Copyright © 2011-2022 走看看