zoukankan      html  css  js  c++  java
  • Makefile

    1、Linux编译过程

      微观的C/C++编译执行的过程。

      C语言     .C      ------->       .exe  

    gcc   hello.c  -o  hello.out

           过程:

        -E   预处理 : 把.h  .c 展开形成一个文件。宏定义直接替换  头文件库文件添加   生成.i文件

    gcc  -E  hello.c  -o  hello.i    //预处理

        -S   汇编:      把.i 文件生成一个汇编代码文件    .S

    gcc  -S  hello.i  -o  hello.s    //汇编生成汇编文件

        -c    编译:      把.S文件生成一个.o 文件    或者.obj文件

    gcc  -c  hello.s  -o  hello.o    //编译生成编译文件

        -o    链接:      把.o文件链接   成  .exe(windows环境)  或者.elf文件

    gcc  hello.o  -o  hello.out  //链接生成可执行文件

    2、脚本语言:Makefile

      Linux C/C++ 必须要使用的一个编译脚本。

      Makefile  大型项目开发。 makefile新的脚本语言

      第一层:

    #注释
    #第一层:显示规则
    #目标文件:依赖文件
    #【TABLE】指令
    #
    #第一个目标文件是最终文件,逆序
    
    hello:hello.o
        gcc -E hello.o -o hello
    
    hello.o:hello.s
        gcc -E hello.s -o hello.o
    
    hello.s:hello.i
        gcc -E hello.i -o hello.s
    
    hello.i:hello.c
        gcc -E hello.c -o hello.i

    以上 ,执行make 命令,显示规则会自动执行。

    #注释
    #第一层:显示规则
    #目标文件:依赖文件
    #【TABLE】指令
    #
    #第一个目标文件是最终文件,逆序
    
    hello:hello.o
        gcc -E hello.o -o hello
    
    hello.o:hello.s
        gcc -E hello.s -o hello.o
    
    hello.s:hello.i
        gcc -E hello.i -o hello.s
    
    hello.i:hello.c    
        gcc -E hello.c -o hello.i
    
    #rm -rf hello.o hello.s hello.i hello
    #伪目标
    #.PHONY: #虚伪的 假的
    #    clear:  #伪目标的目标
    
    .PHONY:
        clearall:
            rm -rf hello.o hello.s hello.i hello  # 执行make clearall 自动执行标签代码
    
        clear:
            rm -rf hello  # 执行make clear 自动执行标签代码

    以上,执行make clear 或者make clearall  命令会根据伪标签指定的标签选择执行。

    # circle.c circle.h cube.c cube.h main.c main.h
    # 得到可以执行的test文件  省去预编译 汇编等
    test:circle.o cube.o main.o
        gcc circle.o cube.o main.o -o test
    circle.o:circle.c
        gcc circle.c -o circle.o
    cube.o:cube.c
        gcc cube.c -o cube.o
    main.o:main.c
        gcc main.c -o main.o
    
    .PHONY:
        clearall:
            rm -rf circle.o cube.o main.o test
        clear:
            rm -rf circle.o cube.o main.o

    以上,执行make 自动编译显示规则,执行make clear 执行隐式规则,make clearall隐式规则清楚全部

      第二层:

     变量 

    =   (替换)

    +=追加   

    :=(常量)

    TAR =test
    OBJ =circle.o cube.o main.o
    CC := gcc
    
    $(TAR) : $(OBJ)
        $(CC)  $(OBJ)  -o $(TAR)
    circle.o:circle.c
        $(CC) circle.c -o circle.o
    cube.o:cube.c
        $(CC) cube.c -o cube.o
    main.o:main.c
        $(CC) main.c -o main.o

      第三层:

     隐式规则   %.c  %.o  任意的.c或者.o   

    *.c  *.o  所有的.c   .o

    %.o : %.c
        $(CC) %.c -o %.o

      第四层:

     通配符

    $^所有的依赖文件   

    $@所有的目标文件

    $<所有的依赖文件的第一个文件     

    会自动匹配同名的.o .c .s文件

    TAR = test
    OBJ = circle.o cube.o main.o
    CC := gcc
    RMRF := rm -rf
    
    $(TAR) : $(OBJ)
        $(CC)   $^   -o    $@
    %.o : %.c
        $(CC)   $^   -o    $@
    .PHONY:
      clearall:
        $(RMRF) $(OBJ) $(TAR)
      clear:
        $(RMRF) $(OBJ)

      第五层:

     函数

  • 相关阅读:
    linux下ls出现文件的后缀有@,* ,/之类的解释
    对shell中cat 和EOF的理解
    linux中test的意义 又可以表示为[]
    Python程序中的进程操作-进程同步(multiprocess.Lock)
    Python程序中的进程操作-开启多进程
    进程的创建和结束
    同步异步阻塞非阻塞
    进程的并行和并发
    进程的调度
    进程基础
  • 原文地址:https://www.cnblogs.com/ucas123/p/14176794.html
Copyright © 2011-2022 走看看