• make命令和makefile文件


      make命令和makefile文件的结合提供了一个在项目管理领域十分强大的工具,它不仅常被用于控制源代码的编译,而且还用于手册页的编写以及将应用程序安装到目标目录。

      makefile文件由一组依赖关系和规则构成,每个依赖关系由一个目标和一组该目标所依赖的源文件组成,而规则描述了如何通过这些依赖文件创建目标,一般来说,目标是一个单独的可执行文件。

    1. make命令的选项和参数

      make程序本身有许多选项,其中最常用的三个选项如下所示:

    (1)-k:让make命令在发现错误时仍然继续执行

    (2)-n:让make命令输出将要执行的操作步骤,而不真正执行这些操作

    (3)-f <filename>:告诉male命令将哪个文件作为makefile文件

    1.1 依赖关系

    myapp: main.o 2.o 3.o 
    main.o: main.c a.h
    2.o: 2.c a.h b.h
    3.o: 3.c b.h c.h

      依赖关系定义了最终应用程序里的每个文件和源文件之间的关系

      如果想一次创建多个文件,可以利用伪目标all

    all:    myapp    myapp.1

      建议约定:在自己的makefile文件中将第一个目标定为all,然后再列出其它重属目标

    1.2 规则

      makefile文件中一个非常奇怪而又令人遗憾的语法现象:空格和制表符是有区别的,规则所在的行必须以制表符开头,用空格是不行的,如果makefile文件中的某行以空格结尾,也可能导致make命令执行失败。

    myapp: main.o 2.o 3.o
        gcc -o myapp main.o 2.o 3.o
    main.o: main.c a.h
        gcc -c main.c 
    2.o: 2.c a.h b.h
        gcc -c 2.c
    3.o: 3.c b.h c.h 
        gcc -c 3.c

    1.3 makefile文件中的宏

      为了让makefile文件在面对大项目时不至于过于庞大和缺乏弹性,makefile文件允许使用宏以一种更通用的格式来书写它们

      MACRONAME = value

      $(MACRONAME)或${MACRONAME}或$MACRONAME

      若要定义一个值为空的宏,可以MACRONAME = 

      宏通常都是在makefile中定义的,但也可以在调用make命令时在命令行上给出宏定义,例如male CC=c89.命令行上的宏定义将覆盖makefile中的宏定义。

    all: myapp 
    
    #which compier
    CC = gcc
    
    #where are include files kept
    INCLUDE = 
    
    #options for development
    CFLAGS =  -g -Wall -ansi
    
    #options for release
    #CFLAGS = -0 -Wall -ansi
    
    myapp: main.o 2.o 3.o
        $(CC) -o myapp main.o 2.o 3.o
    main.o: main.c a.h
        $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
    2.o: 2.c a.h b.h 
         $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
    3.o: 3.c b.h c.h
         $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c

      "-g" 是 gcc 的选项, "-o"也是 gcc 的选项。前者指示加入调试信息,后者指示对代码进行优化。

       gcc 的-Wall 选项可以打印出编译时所有的错误或者警告信息

    1.3.1 make命令内置的特殊宏

      $?   当前目标所依赖的文件列表中比当前目标文件还要新的文件

      $@  当前的目标的名字

      $<   当前规则的第一个依赖文件

      $^   当前规则的所有依赖文件,以逗号分隔

      $*   不包括后缀名的当前依赖文件的名字

      -     告诉make命令忽略所有的错误

      @   告诉make在执行命令前不要将该命令显示在标准输出上@echo

      $(@D) 目标文件的目录名部分

      $(@F) 目标文件的文件名部分

    1.3.2 多个目标

    all: myapp 
    
    #which compier
    CC = gcc
    
    #where to install
    INSTDIR = /usr/local/bin
    
    #where are include files kept
    INCLUDE = 
    
    #options for development
    CFLAGS =  -g -Wall -ansi
    
    #options for release
    #CFLAGS = -0 -Wall -ansi
    
    myapp: main.o 2.o 3.o
        $(CC) -o myapp main.o 2.o 3.o
    main.o: main.c a.h
        $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
    2.o: 2.c a.h b.h 
         $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
    3.o: 3.c b.h c.h
         $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c
    
    clean:
        -rm main.o 2.o 3.o 
    
    install:myapp
        @if [-d $(INSTDIR)]; 
            then 
            cp myapp $(INSTDIR) &&
            chmod a+x $(INSTDIR)/myapp && 
            chmod og-w $(INSTDIR)/myapp;
        else 
            echo "Sorry,$(INSTDIR) does not exist";
        fi

      clean:删除不需要的目标文件,由于clean:的后面是空的,因此该目标总被认为是过时,所以在执行make命令时,如果指定目标clean,则目标所对应的规则将总被执行

      install:将编译成功的应用程序安装到另一个目录下

      -rm:rm命令以减号开头是让make命令忽略rm命令的执行结果

    1.4 内置规则

      可以通过make -p来打印make的所有内置规则,比如:

    OUTPUT_OPTION=-o ¥@
    COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
    %.o: %.c
        $(CONPILE.c) $(OUTPUT_OPTION) $<
  • 相关阅读:
    微信公众号开发的经验与坑
    微信公众号开发经验总结
    微信H5中禁止分享好友及分享到朋友圈的方法
    js 实现纯前端将数据导出excel两种方式,亲测有效
    JavaScript数组的一些方法、数学对象、定时器
    几种动态轨迹可视化效果实现方案-echarts、mapv、deck.gl
    前端大牛的博客收集
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/xiaobingqianrui/p/9176890.html
Copyright © 2020-2023  润新知