• Makefile


      makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令。对于我的理解而言,makefile是将gcc编译的一些命令集中写在一个文件中,一个make就可以全部执行这些命令,也可以先编译再链接,对于一个大型项目来说,通常有上百个需要处理的代码文件,而每次修改后的编译过程往往会消耗我们的大量的时间。而makefile中可以实现只编译已修改的文件,再进行链接(不太耗时),从而节省大量时间。

      makefile三要素:目标,依赖,命令

    例子:实现四则运算并分开编译

      app:main.o add.o sub.o mul.o    生成终极目标app(必须写在第一行)    依赖main.o等   当子目标执行完成后  最后执行此,执行过程:先查找依赖,如果依赖不存在则向下查找有没有生成依赖的。

        gcc main.o add.o sub.o mul.o -o app    要有一个tab

      main.o:main.c           子目标

        gcc -c main.c

      add.o:add.c

        gcc -c add.c

      sub.o:sub.c

        gcc -c sub.c

      mul.o:mul.c

        gcc -c mul.c

      如果只修改的add.c   只编译add.c。实现原理:通过比较app和add.c的时间,在修改之前app的时间应在add.c之后,修改后app的时间在add.c之前。

    进一步修改:使用变量

      obj=main.o add.o sub.o mul.o

      target=app          可以使用vi命令进行替换  3,4s/app/$(target) 将3 4行的app替换为$(target)

      $(target):$(obj)         $(obj) 取obj中的值

        gcc $(obj) -o $(target)

      %.o:%.c            匹配公式,在向下查找main.o时将%t替换为main

        gcc -c $< -o $@      makefile中的自动变量,$<:规则中的第一个依赖 

                                $@:规则中的目标

                                $`:规则中的所有依赖

                                只能在规则的命令中使用

      如gcc main.o add.o sub.o mul.o -o app可写为gcc $` -o $@

      makefile中自己维护的变量:普遍为大写

        CC=cc=gcc  CPPFLAGS=-I

    进一步修改:使用函数,所有函数都有返回值

      src=$(wildcard ./*.c)  使用wildcard函数查找目录下的相应文件,参数跟在函数后面。使用$提取返回值

      ojb=$(patsubst ./%.c, ./%.o,$(src))  匹配替换,把所有的.c替换为.o,.c是src里面的

      如下:

      target=app

      src=$(wildcard ./*.c) 

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

      CC=gcc 

      CPPFLAGS=-I        

      $(target):$(obj)         

        $(CC) $(obj) -o $(target)

      %.o:%.c           

        $(CC) -c $< -o $@

    进一步修改:增加额外的操作

      clean:  用于清除一些中间临时文件

        rm $(obj) $(target)  删除所有的.o和目标文件

      直接make是生成终极目标app,想要执行clean则需要写 make clean

      clean:

        rm $(obj) $(target) -f  强制执行,不管能不能删除

      如果执行目录下有一个clean文件,则会提示clean已是最新的。因为clean是一个目标文件,单实际上并未生成,所以目录下的文件总是最新的。

      解决方法:如果是伪目标(如clean等,未生成的目标),则需要进行申明

        .PHONY:clean

        clean:

          rm $(obj) $(target) -f

      如果在执行过程中出现错误,默认处理方法为退出不执行后续命令。若想继续执行后续命令,则加-

        clean:

          -mkdir /aa    在根目录下创建目录,普通用户无权限,报错!但会继续执行rm命令

          rm $(obj) $(target) -f

  • 相关阅读:
    Vue demo
    netcore使用IOptions
    CS0656 缺少编译器要求的成员“Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create”
    vs删除空白行 注释
    RabbitMQ入门
    EF 大数据量批量处理
    常用链接字符串
    DEA使用git提交代码时,点了commit之后卡死在performing code analysis部分,或者performing code analysis结束后没有进入下一步操作。
    Ubuntu16.04安装MySQL5.7
    ubuntu16.04源码编译安装nginx1.14.2
  • 原文地址:https://www.cnblogs.com/lr1402585172/p/10455044.html
Copyright © 2020-2023  润新知