今天发现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的作用是完全一样的。