zoukankan      html  css  js  c++  java
  • 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)
    
    
  • 相关阅读:
    宿主机无法访问CentOS7上Jenkins服务的解决办法
    415. Add Strings
    367. Valid Perfect Square
    326. Power of Three
    258. Add Digits
    231. Power of Two
    204. Count Primes
    202. Happy Number
    172. Factorial Trailing Zeroes
    171. Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/runnyu/p/4675406.html
Copyright © 2011-2022 走看看