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:指定文件 

  • 相关阅读:
    Xamarin Andro教程搭建Xamarin Androidid开发环境(一)
    判断密文加密类型hash-identifier
    Xamarin Android教程如何使用Xamarin开发Android应用
    分享Kali Linux 2016.2第48周虚拟机
    Xamarin Android教程Android基本知识版本介绍与系统介绍
    iOS10 UI教程视图的生命周期
    iOS10 UI教程视图的绘制与视图控制器和视图
    卡尔曼滤波的原理说明
    Bresenham算法
    Stm32 Bootloader整理
  • 原文地址:https://www.cnblogs.com/douzujun/p/10568893.html
Copyright © 2011-2022 走看看