学习makefile的心得
2010-11-17 13:48:34| 分类:
work
| 标签:
|举报
|字号大中小 订阅
近来一直在忙编程,由于是初次编写一个对我来说算是很大的程序,经验不足,因此耗费了大量的时间精力。
在
之前写一些小的测试用法的程序时,所使用的编译方法比较的简陋,而且也没有注意如何合理得去include子程序,只是简单的把子程序的文件名
include到主程序中。。。这样做真是糟糕透顶了!当然,在子程序很少的时候,这样不会带来什么烦恼,可是我现在面对的是一个有近20个子程序的家
伙。。。于是只得学习别的方法了
之前就知道makefile的存在,但是没有去重视,现在遇到困难了,只好回头认真看看并学习一下了
昨天仿造一个对makefile的介绍文档上的做法,写了一个简易的测试程序,尝到了makefile的甜头,不过昨天的那个程序还太简单,需要做稍微复杂点的测试,于是就有了今天这个测试程序:用欧拉法解微分方程
-----------------------------------------
main.c
-----------------------------------------
#include"stdio.h"
#include"head.h"
#define h 1.0e-2
int main()
{
double a,b;
double t,t0,y,y0,f;
int i,N;
FILE *fp;
fp=fopen("test.dat","w");
// Input a,b, the boundary of t.
printf("Enter a and b (a<b):\n");
scanf("%lf %lf",&a,&b);
printf("Initial value of y:\n");
scanf("%lf",&y0);
t0=a;
y=y0;
N=(int)(b-a)/h;
for(i=0;i<=N;i++)
{
f=fun(t,y);
y=y+fun(t,y)*h;
t=t+h;
printf("t=%e y=%e f=%e\n",t,y,f);
fprintf(fp,"%e %e %e\n",t,y,f);
}
fclose(fp);
}
/////////////////////////////////////////////////////
head.h
------------------------------------------------------
#ifndef _HEAD_H_
#define _HEAD_H_
double fun(double x,double y);
double param1(double p);
double param2(double p);
#endif
/////////////////////////////////////////////////////
function1.c
-----------------------------------------------------
#include"head.h"
double fun(double x,double y)
{
double z,s,l;
s=param1(x);
l=param2(x);
z=s*y-l*x*x+1;
return z;
}
//////////////////////////////////////////////////////
function2.c
------------------------------------------------------
#include"math.h"
double param1(double p)
{
return sin(p);
}
double param2(double p)
{
return cos(p);
}
//////////////////////////////////////////////////////
Makefile
------------------------------------------------------
main: main.o function1.o function2.o
cc -o main main.o function1.o function2.o -lm
main.o:main.c head.h
cc -c main.c
function1.o:function1.c head.h
cc -c function1.c
function2.o:function2.c head.h
cc -c function2.c
clean:
rm main main.o function1.o function2.o
/////////////////////////////////////////////////////////
通过两次测试,还去除了我之前的一些错误的想法。之前我总是习惯将要被调用的子程序的函数名和文件名写成一致的,测试后发现,那样根本不需要。。。。。。
现在想来,其实原因很简单:那些文件(存放子程序)只是保存这程序的一部分,编译只是和文件里面的内容有关,与它自身的文件名无关,文件只是方便在编译时编译器能够找到对应(正确的)的子程序代码。。。
还是实战来得实在啊!
评论这张
转发至微博
转发至微博
评论