zoukankan      html  css  js  c++  java
  • 5.makefile

    makefile

    一、gcc

    gcc是用来编译代码的编译器

    编译完之后有一些常见的输出文件
    1 .a	静态库(文档)
    2 .c	需要预处理的c语言源代码
    3 .h	C语言源代码的头文件
    4 .i	经过预处理后的C语言源代码
    5 .o	目标文件(经过汇编产生)
    6 .s	经过编译后产生的汇编语言代码
    7 .elf	可执行文件(linux下的可执行文件)
        
    //编译过程
    .c -》 .i -》 .s -》 .o
    //链接过程
    把多个.o链接成一个可执行文件(ELF/.exe)
    
    -o:是输出的意思
    1. gcc -E test.c -o test.i  //查看经过预处理之后的c语言源代码
        
    2. gcc -s test.c -o test.s  //查看编译后产生的汇编语言编码
       gcc -s test.i -o test.s	 //也可以查看编译后产生的汇编语言编码
       //意思就是.c文件可以直接到.s文件,也可以.c——>.i——>.s
        
    3. gcc -c test.c -o test.o  //形成目标文件
    4. gcc test.o -o test	//形成可执行文件
    //经过上面四步形成了可执行文件
     
    5. gcc test.c -o hello //直接将test.c编译成叫hello的可执行文件
        
    6. ./hello //运行hello这个可执行文件
    .0——二进制可执行代码(机械码),不具备可执行的能力
        
    

    二、makefile---数据库文件或则叫文本文件

    linux的过程都是自己可以控制的

    在gcc中可以通过将.c文件编译成.o文件

    那么如果有多个.c文件呢,这些都要编译成.o文件,这样需要输入多条指令去执行吗?

    可以通过makefile

    例如:

    myadd.h文件
    int myAdd(int a,int b);
    
    myadd.c文件
    #include<myadd.h>
    int myAdd(int a,int b)
    {
        return a+b;
    }
    
    mysub.h文件
    int mySub(int a,int b);
    
    mysub.c文件
    #include<mysub.h>
    int mySub(int a,int b)
    {
        return a-b;
    }
    
    muproject.c文件
    #include<stdio.h>
    #include<myadd.h>
    #include<mysub.h>
    void main()
    {
        int num1=10;
        int num2=20;
        int num3=30;
        printf("%d
    ",myAdd(num1,mySub(num2,num2)));
    }
    
    myproject.c文件引用了两个自定义的头文件,那么要实现myproject.c就必须将三个自定义的.c文件编译成.o文件,然后再将这三个.o文件一起链接成一个可执行文件
        
        gcc -c myadd.c -o myadd.o
        gcc -c mysub.c -o mysub.o
        gcc -c myproject.c -o myproject.o
        gcc  myadd.o mysub.o myproject.o -o test1
    

    makefile的好处:自动化编译

    make命令,需要一个makefile文件,在makefile文件中去告诉make命令需要这怎样去编译和链接程序。makefile是一个文本形式的数据库文件,包含一些规则来告诉make处理哪些文件以及如何处理这些文件

    规则

    target:depend
        command
        整个算一条执行语句
    target:目标,可以是一个中间文件,也可以是一个最终的执行文件
    depend:依赖,指要生成目标文件所需要的文件或目标
    command:make需要执行的命令
    //gcc -c test.c -o test.0——gcc就是命令,test.c是依赖,test.o是目标
      
    hello.i:hello.c
        gcc -E -o hello.i hello.c
    

    makefile执行顺序

    默认执行第一条语句,在执行第一条时,先找所有的依赖文件,如果没有,继续往下找有没有脚本能生成这个依赖文件,如果有就会先执行下面生成依赖文件的语句
    test:prog.o code.o
        gcc -o test prog.o code.o
    prog.o:prog.c
        gcc -c prog.c -o prog.o
    code.o:code.c
        gcc -c code.c -o code.o
                 
    clean:
    	rm -f *.o
    //清除,伪目标,没有依赖项
            
    myproject:myadd.o mysub.o myproject.o
    	gcc myadd.o mysub.o myproject.o -o myproject
    myadd.o:myadd.c
    	gcc -c myadd.c -o myadd.o
    mysub.o:mysub.c
    	gcc -c mysub.c -o mysub.o
    myproject.o:myproject.c
    	gcc -c myproject.c -o myproject.o
    clean:
    	rm -f *.o myproject
               
    

    makefile变量

    变量理解为字符串
    OBJ = a b c	  表示OBJ就是 a b c这三个变量,不能再改变了
    OBJ := a b c  表示OBJ是 a b c这三个变量,但是可以用+=去追加
    OBJ += d	表示OBJ变量添加了 d 这一个变量
      
    变量引用:
        $(变量名)
     
    

    makefile示例

    通配符:% * ?
        %——表示任意一个
        *——表示所有
        ?——表示匹配一个未知的东西
    OBJ:=myadd.o mysub.o
    OBJ+=myproject.o
        
    myproject:$(OBJ)
        gcc $(OBJ) -o myproject
    *.o:*.c
        gcc -c *.c -o *.o
        
    .MYDEL://表示clean是一个伪标签
    clean:
    	rm -rf *.o myproject
            
    $@——表示目标文件
    $^——表示依赖文件
          
    target=myproject
    OBJ:=myadd.o mysub.o
    OBJ+=myproject.o
    CC:=gcc
    CFLAGS:=-C
        
    $(target):$(OBJ)
        $(CC) $^ -o $@
    *.o:*.c
        $(CC) $(CFLAGS) $^ -o $@
        
    .MYDEL://表示clean是一个伪标签
    clean:
    	rm -rf *.o $(target)
    
  • 相关阅读:
    查找二叉树(BST)
    利用堆计算中位数
    java文件的上传与下载通用版
    input框checkBox全选单选js操作,后台取值
    ArrayList源码简单解析
    echarts柱状图的学习01
    Oracle中的存储过程,存储函数
    简单的Oracle分页公式
    入门级的SSM架构搭建解析
    mybatis动态Sql详解
  • 原文地址:https://www.cnblogs.com/Kissfly123/p/15371093.html
Copyright © 2011-2022 走看看