(C语言)通过makefile实现多个C文件的编译

今天发现Lightly IDE不支持编译多文件工程,但可以通过自己编写makefile而在Lightly IDE提供的Linux云端上实现编译,于是通过踩坑写下自己第一个makefile。

一、源、头文件

/*main.c*/
#include "main.h"

int main(void) 
{
    Sum.N = (unsigned long int)pow(10.0, 2);
    printf("%f\r\n", Sum.calculate_fun1(Sum.N));
    printf("%f\r\n", Sum.calculate_fun2(Sum.N));
    printf("%f\r\n", Sum.calculate_fun_accurate(Sum.N));
    printf("%d, %d\r\n", Sum.calculate_enob(Sum.calculate_fun1(Sum.N), Sum.N), Sum.calculate_enob(Sum.calculate_fun2(Sum.N), Sum.N));


    Sum.N = (unsigned long int)pow(10.0, 4);
    printf("%f\r\n", Sum.calculate_fun1(Sum.N));
    printf("%f\r\n", Sum.calculate_fun2(Sum.N));
    printf("%f\r\n", Sum.calculate_fun_accurate(Sum.N));
    printf("%d, %d\r\n", Sum.calculate_enob(Sum.calculate_fun1(Sum.N), Sum.N), Sum.calculate_enob(Sum.calculate_fun2(Sum.N), Sum.N));

    Sum.N = (unsigned long int)pow(10.0, 6);
    printf("%f\r\n", Sum.calculate_fun1(Sum.N));
    printf("%f\r\n", Sum.calculate_fun2(Sum.N));
    printf("%f\r\n", Sum.calculate_fun_accurate(Sum.N));
    printf("%d, %d\r\n", Sum.calculate_enob(Sum.calculate_fun1(Sum.N), Sum.N), Sum.calculate_enob(Sum.calculate_fun2(Sum.N), Sum.N));

    return 0;
}

/*main.h*/
#ifndef __MAIN_H__
#define __MAIN_H__

#include <stdio.h>
#include <math.h>
#include "sum.h"

#endif

/*sum.c*/
#include "main.h"

static float calculate_fun1(unsigned long int);
static float calculate_fun2(unsigned long int);
static float calculate_fun_accurate(unsigned long int);
static int calculate_enob(float, unsigned long int);

Sum_t Sum = {0, calculate_fun1, calculate_fun2, calculate_fun_accurate, calculate_enob};

static float calculate_fun1(unsigned long int N)
{
    float S_N = 0;
	unsigned long int j = 0;

    for(j = 2; j <= N; j++)
    {
        S_N += (float)(1.0 / (j * j - 1));
    }

    return S_N;
}

static float calculate_fun2(unsigned long int N)
{
    float S_N = 0;
	unsigned long int j = 0;

    for(j = N; j >= 2; j--)
    {
        S_N += (float)(1.0 / (j * j - 1));
    }

    return S_N;
}

static float calculate_fun_accurate(unsigned long int N)
{
    float S_N = (float)((1.0/2)*((3.0/2)-(1.0/N)-(1.0/(N+1))));

    return S_N;
}

static int calculate_enob(float CalVal, unsigned long int Mi)
{
    int enob = 0;
    while(((float)fabs(CalVal - (1.0/2)*((3.0/2)-(1.0/Mi)-(1.0/(Mi+1)))) <= (1.0/2) * (pow(10.0, (-1)*enob))))
    {
        enob++;
    }
    enob--;
    return enob;
} 

/*sum.h*/
#ifndef __SUM_H__
#define __SUM_H__

typedef struct 
{
    unsigned long int N;
    float (*calculate_fun1)(unsigned long int);
    float (*calculate_fun2)(unsigned long int);
    float (*calculate_fun_accurate)(unsigned long int);
    int (*calculate_enob)(float, unsigned long int);
} Sum_t;

extern Sum_t Sum;

#endif

 

二、makefile

CC = gcc
CFLAGS = -lm

main: main.o sum.o
	$(CC) -o main main.o sum.o $(CFLAGS)

main.o: main.c
	$(CC) -c main.c $(CFLAGS)

sum.o: sum.c
	$(CC) -c sum.c $(CFLAGS)

clean:
	rm *.o
	rm main

 

三、编译结果

 

四、小结

1. 在使用pow函数时,光包含math头文件是不够的,在编写makefile时还需要加上-lm选项。

2. 在使用dev c++,编译器其实自动给你的工程写了一个Makefile.win文件,和本文makefile的作用是完全一样的。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值