• Makefile


    首先我们先了解gcc的基本用法

    建立如下的demo.c文件

    #include <stdio.h>
    int main(void)
    {
           printf("hello world
    ");  
    }

    使用gcc来编译该文件,会生成a.out的可执行文件

    gcc demo.c

    我们可以使用-o选项来指定输出的文件名

    执行如下命令会生成hello可执行文件

    gcc demo.c -o hello

    我们可以把编译过程分为3个部分:预处理、汇编、链接

    可以使用-E选项进行预处理

    gcc -E demo.c -o hello.c

    查看hello.c文件,可以看见头文件被全部包含进来了,预处理会把带#的代码(如#include、#define、#ifndef)进行处理

    使用-c选项可以进行汇编,生成.o文件

    我们将建立3个文件进行测试

    首先是add.h文件,它只包含了函数的声明

    int add(int,int);

    然后使add.c文件,它包含了add函数的实现

    int add(int a,int b)
    {
         return (a+b);
    }

    然后是我们的测试函数test.c,它包含了头文件add.h

    #include "add.h"
    #include <stdio.h>
    int main(void)
    {
         printf("1+1=%d
    ",add(1,1));
    }

    使用-c选项将两个文件进行汇编

    gcc -c add.c -o add.o
    gcc -c test.c -o test.o

    使用下面命令对两个.o文件进行链接,生成可执行文件

    gcc test.o add.o -o test

    Makefile基本语法

    如果要编译的文件数目较少,直接使用gcc进行编译时可以接受的。但是一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,这时候使用make命令就必不可少了。

    make是一个命令工具,它解释Makefile文件中的指令,下面是Makefile文件的基本语法

    target ... : prerequisites ... 
                 command 
                 ... 
                 ... 

    target是一个目标文件,可以是Object File,也可以是执行文件。

    prerequisites是要生成那个target所需要的文件或是目标。

    command是make需要执行的命令。(任意的Shell命令) 

    我们可以这样编写Makefile文件(command之前一定要以一个Tab键作为开头),用来实现与上面直接使用gcc编译相同的功能。

    test:add.o test.o
      gcc add.o test.o -o test
      @echo "------success------"
    test.o:test.c add.h
      gcc -c test.c
    add.o:add.c
      gcc -c add.c
    clean:
      rm test.o add.o

    然后调用make命令就可以成功编译。如果一行的东西太多,我们可以使用进行换行。

    在默认情况下,我们输入make命令之后会在当前目录下找M(m)akefile文件,如果找到,它会找文件中的第一个目标文件(target)并把这个文件作为最终的目标文件。

    prerequisites用来确定依赖关系。make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令。 

    clean不是一个文件,它只不过是一个动作名字,可以使用make clean命令来清除临时的.o文件。

    Makefile中的变量

    我们可以在Makefile文件中声明跟使用变量,例如我们可以这样修改上面的Makefile文件

    objs=add.o test.o
    
    test:$(objs)
      gcc $(objs) -o test
      @echo "------success------"
    test.o:test.c add.h
      gcc -c test.c
    add.o:add.c
      gcc -c add.c
    clean:
      rm $(objs)
    
    

    第一行我们声明了objs变量,下面使用$(objs)来使用该变量(实际上只是简单的替换)。可以在Makefile中多处使用该变量来简化代码,而且如果有新的.o文件加入,只需要修改变量而不必每个都修改。

    Makefile的自动推导

    make命令可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。 

    只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,因此我们只需要这样编写Makefile

    objs=add.o test.o
    
    test:$(objs)
      gcc $(objs) -o test
      @echo "------success------"
    test.o:add.h
      gcc -c test.c
    add.o:
      gcc -c add.c
    clean:
      rm $(objs)
    
    
  • 相关阅读:
    JavaScript(第五天)【流程控制语句】
    JavaScript(第四天)【运算符】
    JavaScript(第二天)【语法,变量】
    JavaScript(第一天)【<script>标签浅析】
    JavaScript(简介)【Javascript历史】
    [LeetCode-JAVA] Substring with Concatenation of All Words
    [LeetCode-JAVA] Reverse Nodes in k-Group
    [LeetCode-JAVA] Median of Two Sorted Arrays
    [LeetCode-JAVA] Contains Duplicate IIIMaximal Square
    [LeetCode-JAVA] Contains Duplicate III
  • 原文地址:https://www.cnblogs.com/runnyu/p/4675406.html
Copyright © 2020-2023  润新知