Linux--makefile的使用

概述

        在工程中,一个工程有多个源文件,按类型、功能、模块分别放在不同的目录中,makefile定义了一系列的规则来指定,文件编译的一系列操作;

make是一条命令,makefile是一个文件,两者搭配使用,完成项目的自动化构建;

makefile的书写规则

[目标文件]:[依赖文件1] [依赖文件2] ...

    ...

例:

test.i:test.c
    gcc -E test.c -o test.i

将test.c 编译成test.i文件

完整示例:

main:main.o add.o sub.o
      gcc main.o add.o sub.o -o main      //链接main.o add.o sub.o生成可执行文件main
main.o:main.c add.h sub.h
      gcc -c main.c add.h sub.h -o main.o  //编译生成main.o
add.o:add.c
      gcc  add.c -o add.o   //编译生成add.o
sub.o:sub.c
      gcc -c sub.c -o sub.o   //编译生成sub.o
.PHONY:clean     //声明clean为伪目标
clean:
      rm -f main.o add.o sub.o main add.h.gch sub.h.gch   //使用make clean指令删除中间文件

变量的使用:

例:

obj=main.o add.o sub.o
main:$(obj)
    gcc $(obj) -o main

自动化变量:

在makefile中,存在系统默认的自动化变量

$@ :代表目标文件

$< :代表第一个依赖文件

$^ :代表所有依赖文件

例:

main:main.o add.o sub.o
    gcc main.o add.o sub.o -o main
//可以写成
main:main.o add.o sub.o
    gcc $^ -o $@

若一号写不下,可用换行符"/"

让make自动推导

make看到一个[.o]文件,它就自动把同名的[.c]文件加在依赖关系中,例如maek找到一个main.o,那么main.c就是mian.o的依赖文件。并且gcc -c main.c -o main.o也会被推导出来,于是利用make的自动推导可以简化makefile的书写;

例:

main:main.o add.o sub.o
      gcc main.o add.o sub.o -o main
main.o:main.c add.h sub.h
      gcc -c main.c add.h sub.h -o main.o
add.o:add.c
      gcc  add.c -o add.o
sub.o:sub.c
      gcc -c sub.c -o sub.o
.PHONY:clean
clean:
      rm -f main.o add.o sub.o main add.h.gch sub.h.gch

可以写成:

main:main.o add.o sub.o
    gcc $^ -o $@
main.o:add.h sub.h
.PHONY:clean
    rm -f main.o add.o sub.o add.h.gch sub.h.gch

使用步骤

例:

编写一个名为test的工程

(1)创建一个名为test的文件夹并进入;

:mkdir test

:cd test

(2)用vim编写各个程序文件

main.c

 #include
 #include"add.h"
 #include"sub.h"
 int main()
{
     int a = 10;
     int b = 6;
     printf("%d + %d = %d\n",a,b,add(a,b));//实现加法
     printf("%d - %d = %d\n",a,b,sub(a,b));//实现减法
     return 0;
}

add.c

#include
int add(int x, int y)
{
     return x + y;
}

add.h

#ifndef __ADD_H__
#define __ADD_H__
 
int add(int x, int y);
 
#endif

sub.c

#include
int sub(int x, int y)
{
     return x - y;
}

sub.h

#ifndef __SUB_H__
#define __SUB_H__
 
int sub(int x, int y);
 
#endif

(3)编写maekfile文件

makefile/Makefile

main:main.o add.o sub.o
      gcc main.o add.o sub.o -o main
main.o:main.c add.h sub.h
      gcc -c main.c add.h sub.h -o main.o
add.o:add.c
      gcc  add.c -o add.o
sub.o:sub.c
      gcc -c sub.c -o sub.o
.PHONY:clean
clean:
      rm -f main.o add.o sub.o main add.h.gch sub.h.gch

(4)编译工程

:make

(5)执行

:./main

(6)清除中间文件

:make clean

你可能感兴趣的:(Linux)