linux gcc makefile 简单例子

任务:

现在有一个文件1.txt ,内容如下:

$ vi 1.txt

0.3

5

5.77

5.3

55

667

55

332

55.6

77.8

343.01

788

设计一个含 Makefile 文件的工程, 实现求最大数(文件max.c),最小数(文件min.c),算术平均数(文件m-mean.c),几何平均数(文件g-mean.c),方差(文件var.c), 写出:

  1. 写出Main.c 和各个子函数(主要是调用个子文件中的函数的流程)
  2. 写出Makefile
  3. 编译后,执行,贴出拷屏的结果。

注:以下所有文件均在同一个目录下,.h 文件就按 .c 文件中的去声明就OK

makefile

1
2
3
4
5
6
7
8
9
10
CC = gcc  # C语言对应gcc,C++为g++
CFLAGS = -Wall  # 表示显示所有可能的警告

# 编译的顺序是从左到右的 即左边的文件依赖右边的文件
main:main.o var.o m_mean.o g_mean.o min.o max.o
    $(CC) -o main $^ -lm  # 用-lm以使用数学库
%.o:%.c  # 表示由.c文件生成同名的.o文件
    $(CC) $(CFLAGS) -c $^  # $^表示所有依赖文件
clean:
    rm -rf main.o max.o min.o m_mean.o g_mean.o var.o

main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "max.h"
#include "min.h"
#include "m_mean.h"
#include "g_mean.h"
#include "var.h"


int main()
{
    char filename[] = "1.txt";
    FILE *fp;
    char StrLine[10];  //max char numbers that can be read in each linew
    if((fp=fopen(filename,"r")) == NULL)  //file not exists
        return -1;
    float arr[100];
    int j=0;
    while(!feof(fp))
    {
        fgets(StrLine,10,fp);  //readline
        //strtok(StrLine,"\n");
        StrLine[strlen(StrLine)-1]='\0'; //delete \n in the end
        arr[j]=(float)atof(StrLine);  //change char to num
        //printf("%s ",StrLine);  //print
        j++;
    }
    fclose(fp);  //remenber to close
    int size=j-1;
    printf("read %d numbers in 1.txt\n",size);
    printf("they are:\n");
    for(int i=0;i<size;i++)
        printf("%.2f ",arr[i]);
    printf("\n");
        printf("max is %.2f \n",max(arr,size));
        printf("min is %.2f \n",min(arr,size));
        printf("m_mean is %.2f \n",m_mean(arr,size));
        printf("g_mean is %.2f \n",g_mean(arr,size));
        printf("var is %.2f \n",var(arr,size));
   
return 0;
}

max.c

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

float max(float arr[], int size)
{
    float result=arr[0];
    for(int i=0;i<size;i++)
        if(arr[i]>result)
            result=arr[i];
    return result;
}

min.c

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

float min(float arr[], int size)
{
        float result=arr[0];
        for(int i=0;i<size;i++)
                if(arr[i]<result)
                        result=arr[i];
        return result;
}

g_mean.c

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <math.h>

float g_mean(float arr[],int size)
{
        float mul=0;
        for(int i=0;i<size;i++)
                mul*=arr[i];
        return size?pow(mul,1/size):-1;
}

m_mean.c

1
2
3
4
5
6
7
8
9
#include <stdio.h>

float m_mean(float arr[], int size)
{
    float sum=0;
        for(int i=0;i<size;i++)
        sum+=arr[i];
        return size?sum/size:-1;
}

var.c

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include "m_mean.h"

float var(float arr[],int size)
{
    float og_m = m_mean(arr,size);  //m-mean of the original arr
    float new_arr[size];
        for(int i=0;i<size;i++)
                new_arr[i] = arr[i] * arr[i];
    float new_m = m_mean(new_arr,size);  //m-mean of the new arr
        return new_m - og_m * og_m;
}

如何运行: