Linux-makefile

1. make的优点

2.makefile基本语法

目标(target):目标文件1 目标文件2
    gcc -o 欲新建的可执行文件 目标文件1 目标文件2

3.实例

现在我们有如下三个文件
main.c tool.c tool.h

文件内容如下
main.c

#include "tool.h"
#include <stdio.h>

int main()
{
    int arr[5] = {1,8,6,3,4};
    int m = find_max(arr,5);
    printf("%d\n",m);
    return 0;
}

tool.c

#include "tool.h"

int find_max(int arr[],int n)
{
    int m = arr[0];
    int i;
    for(i=0;i<n;i++)
    {
        if(arr[i]>m)
          m = arr[i];
    }
    return m;
}

tool.h

int find_max(int arr[],int n);
makefile文件按照以下格式写
mian:main.c tool.o
    gcc main.c tool.o -o main

tool.o:tool.c 
    gcc -c tool.c

clean:
    rm *.o main

命令行执行make

[ubuntu@VM-48-245-ubuntu ~/makefile_test]$ make

可以看到输出文件如下

main  main.c  makefile  tool.c  tool.h  tool.o

clean是用于删除.o结尾的文件和main文件,执行make clean

make clean

之后文件只剩下

main.c  makefile  tool.c  tool.h

实例2

现在有如下文件

bar.h  foo.c  foo.o  main.c  bar.c   bar.o  foo.h  

bar.h代码如下

#include "bar.h"

int find_min(int arr[],int n)
{
    int m = arr[0];
    int i;
    for(i=0;i<n;i++)
    {
        if(arr[i]<m)
          m = arr[i];
    }
    return m;
}

foo.c代码如下

#include "foo.h"

int find_max(int arr[],int n)
{
    int m = arr[0];
    int i;
    for(i=0;i<n;i++)
    {
        if(arr[i]>m)
          m = arr[i];
    }
    return m;
}

bar.h和foo.h分别是两个函数的声明,这里不再列出,然后是main.c文件,如下

#include "foo.h"
#include "bar.h"
#include <stdio.h>

int main()
{
    int arr[] = {1,8,3,4,5};
    int min = find_min(arr,5);
    int max = find_max(arr,5);
    printf("min = %d\n",min);
    printf("max = %d\n",max);
    return 0;
}

makefile如下

main:main.c foo.o bar.o
    gcc main.c foo.o bar.o -o main
foo.o:foo.c
    gcc -c foo.c
bar.o:bar.c
    gcc -c bar.c
clean:
    rm *.o main
使用shell script变量简化makefile

变量的基本语法:
1.变量最好以“大写字母”为主
2.运用变量时,以 ${变量} 或 $(变量) 使用
此时makefile可以更改为

CC = gcc

main:main.c foo.o bar.o
    $(CC) main.c foo.o bar.o -o main
foo.o:foo.c
    $(CC) -c foo.c
bar.o:bar.c
    $(CC) -c bar.c
clean:
    rm *.o main

以后如果我们想用g++编译的话,就可以把第一行gcc改为g++
如果我们想加入链接时也可以使用变量来替换.

实例3

如果我们现在讲上面的main.c拆成两个分别为main_max.c和main_min.c
main_max.c

#include "foo.h"
#include "bar.h"
#include <stdio.h>

int main()
{
    int arr[] = {1,8,3,4,5};
    int max = find_max(arr,5);
    printf("max = %d\n",max);
    return 0;
}

更改makefile文件如下

CC = gcc

main_max:main_max.c foo.o bar.o
    $(CC) main_max.c foo.o bar.o -o main_max
main_min:main_min.c foo.o bar.o
    $(CC) main_min.c foo.o bar.o -o main_min
foo.o:foo.c
    $(CC) -c foo.c
bar.o:bar.c
    $(CC) -c bar.c
clean:
    rm *.o main

执行make后,发现只执行了第一条记录

这里写图片描述

为了全部执行,将makefile更改如下

CC = gcc
all:main_max main_min
main_max:main_max.c foo.o bar.o
    $(CC) main_max.c foo.o bar.o -o main_max
main_min:main_min.c foo.o bar.o
    $(CC) main_min.c foo.o bar.o -o main_min
foo.o:foo.c
    $(CC) -c foo.c
bar.o:bar.c
    $(CC) -c bar.c
clean:
    rm *.o main

现在两个都可以编译了

这里写图片描述

可以看到两个文件都已出现

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值