• linux学习之Makefile篇


    Makfile

    1.用途

    • 项目代码编译管理
    • 节省编译项目时间(在编译的时候之编译修改过的.c文件,并和之前编译好的.o链接使用)
    • 一次编写终身受益

     

          

    #目标:依赖(条件)
    #命令
    #阶段一
    #app:add.c sub.c dive.c  mul.c main.c
    #gcc add .c sub.c dive.c mu.c main.c -o app
    #
    
    #阶段二
    #app:add.o sub.o dive.o mul.o
    #gcc add.o sub.o dive.o mul.o main.o -o app
    
    #add.o:add.c
    # gcc -c add.c
    
    #sub.o:sub.c
    # gcc -c sub.c
    
    #dive.o:dive.c
    # gcc -c dive.c
    
    #mul.o:mul.c
    # gcc -c mul.c
    
    #main.o:main.c
    # gcc -c main.c
    
    #阶段三(比较通用,和源代码已经没什么关系了)
    #$@表示目标,$^表示所有依赖,$<表示依赖中的第一个
    #obj=add.o sub.o mul.o dive.o main.o
    #src=$(wildcard  *.c)//找到当前目录下所有以点c结尾的文件名
    #obj=$(pathsubst %.c,%.o,$(src))//将src中的所有.替换成同名的.o,仅仅是文件名替换。
    #target=app//目标文件变量
    
    #$(target):$(obj)
      gcc $^  -o  $@
    
    #%.o:%.c
    #  gcc -c $< -o $@
    
    
    #阶段四
    CPPFLAGS=-Iinclude//预处理器标志,指定头文件在哪
    CFLAGS=-g -Wall//编译时候的参数
    LDFLAGS=-L../lib -lmycalc//指定共享库
    CC=gcc //指定编译器
    
    
    src=$(wildcard  *.c)
    obj=$(pathsubst %.c,%.o,$(src))
    target=app
    
    $(target):$(obj)
      gcc $^  $(LDFLAGS) -o  $@
    
    %.o:%.c
       gcc -c $< $(CFLAGS)$(CPPFLAGS)-o $@
    .PHONY:clean
    clean:
          -rm -f *.o
          -rm -f app
    #彻底清除生成过程文件和生成配置文件
    distclean:
    rm /usr/bin/app
    install:
    cp app /usr/bin
    test: @echo src;

        阶段一:先至上而下建立关系树

           阶段二:自下而上执行命令

          阶段三阶段四都是让变得通用。

         只要知道makefile怎么工作就好。

    2.基本规则

    三要素:

    • 目标
    • 条件
    • 命令

    3.Makefile工作原理

    • 分析各个目标和依赖之间的关系
    • 根据依赖关系自底向上执行命令
    • 根据修改时间比目标新,确定更新(之前介绍的那三个时间中的最后修改时间)
    • 如果目标不依赖任何条件,则执行对应命令,以示更新

    4.clean

    • 用途:清除编译生成的中间.o文件和最终目标文件。
    • make clean 如果当前目录下有同名clean文件,则不执行clean对应的命令
    • 伪目标声明:.PHONY:clean
    • clean 命令中的特殊符号

                  -"-” 此条命令出差,make也会继续执行后续的命令。如:“-rm main.o”

                  -"@‘’不显示命令本身,只显示结果。如:“@echo”  clean done “”

    • 其他

               -make默认执行第一个出现的目标,可通过make dest 指定要执行的目标

               -distclean目标

               -install目标

               -make -C 指定目录   进入指定目录,调用里面的Makefile

  • 相关阅读:
    进程池Pool
    进程间通信-Queue
    多任务版udp聊天器
    列表循环放引用并写出打印结果
    协程实现tcp两个客户端的通讯
    正则匹配身份证和邮箱
    python中上双互斥锁的线程执行流程
    小巧的http live streaming m3u8播放器
    js实现@提到好友
    mongoose多级嵌套操作
  • 原文地址:https://www.cnblogs.com/rainbow1122/p/7826369.html
Copyright © 2020-2023  润新知