实验三 makefile文件的编写.docx
《实验三 makefile文件的编写.docx》由会员分享,可在线阅读,更多相关《实验三 makefile文件的编写.docx(12页珍藏版)》请在冰豆网上搜索。
![实验三 makefile文件的编写.docx](https://file1.bdocx.com/fileroot1/2022-11/15/eb81f0fc-15e8-4e6e-acf5-8f7dccae52fb/eb81f0fc-15e8-4e6e-acf5-8f7dccae52fb1.gif)
实验三makefile文件的编写
实验三makefile文件的编写
一、实验目的
1、了解Makefile的基本概念和基本结构
2、初步掌握编写简单Makefile的方法
3、初步掌握利用GNUMake编译应用程序的方法
二、实验内容
采用两种方法编写简单程序的makefile文件,并使用make命令生成可执行文件。
三、实验指导与步骤
用make命令生成可执行文件,并执行该程序。
GNUmake工作时的执行步骤如下:
1、读入所有的Makefile。
2、读入被include的其它Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系,决定哪些目标要重新生成。
7、执行生成命令。
Makefile的基本结构
Makefile的一般结构:
target……:
dependency……
command……
结构中各部分的含义:
(1)、target(目标):
一个目标文件,可以是Object文件,也可以是执行文件。
还可以是一个标签(Label)。
(2)、dependency(依赖):
要生成目标文件(target)所依赖哪些文件
(3)、command(命令):
创建项目时需要运行的shell命令(注:
命令(command)部分的每行的缩进必须要使用Tab而不能使用多个空格)。
Makefile实际上是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于dependency中的文件,其生成规则定义在命令command中。
如果依赖文件(dependency)中有一个以上的文件比目标(target)文件要新的话,shell命令(command)所定义的命令就会被执行。
这就是Makefile的规则。
也就是Makefile中最核心的内容。
四、实验报告要求
1.实验目的
2.实验内容
学习如何编写简单的makefile文件。
3.实验详细步骤
写出整个项目的源程序,两种方法实现的makefile文件,并记录在编写makefile文件时遇到的错误和修改方法。
4.实验技巧和心得体会
附录:
编写简单程序的makefile文件
编写头文件、源文件以及makefile文件,源文件主要有init.c、sort_a.c、find.c、find_bin.c、print.c以及main.c,分别实现数组的初始化,数组的排序,数组顺序查找,数组的二分法查找,数组的打印以及主函数部分功能的实现,头文件有locating.h和func.h,前者是包含库的头文件,后者是功能函数的声明。
注意,所有文件必须在同一目录下。
步骤:
1.在终端主目录下创建locating文件夹,并进入文件夹。
命令为:
mkdir~/locating
cdlocating
2.创建init.c、sort_a.c、find.c、find_bin.c、print.c、main.c、locating.h、func.h和makefile
命令为:
geditinit.csort_a.cfind.cfind_bin.cprint.cmain.csocating.hfunc.hmakefile
也可以单独创建,如果没有保存对应文件,文件将不存在(gcc改为touch,直接创建保存)。
3.编写代码
locating.h文件:
#ifndef_LOCATING_H_
#define_LOCATING_H_
#defineN10
#include
#include
#include
#include
#endif
func.h文件:
#ifndef_FUNC_H_
#define_FUNC_H_
/*-------------------数组初始化----------------*/
voidinit_array(inta[],intn);
/*-------------------数组排序-----------------*/
voidinsert_sort(inta[],intn);//插入排序
/*-------------------顺序查找-----------------*/
intfind_array_1(inta[],intlength,intvalue);
intfind_array_2(inta[],intlength,intvalue);
/*------------------二分法查找---------------*/
intfind_array_bin_1(inta[],intlength,intvalue);
intfind_array_bin_2(inta[],ints,inte,intvalue);
/*-------------------打印数组-----------------*/
voidprint_array(inta[],intn);
#endif
init.c文件:
/*----------------数组初始化----------------*/
#include"locating.h"
voidinit_array(inta[],intn)//a是数组名,n是元素个数
{
inti=0;
srand(time(0));//srand函数是随机数发生器的初始化函数
for(i=0;ia[i]=random()%N;
}
sort_a.c文件:
/*---------------插入排序-------------------*/
#include"locating.h"
voidinsert_sort(inta[],intn)//a是数组名,n是元素个数
{
registerinttemp,i,j;
for(i=0;i{
temp=a[i+1];
for(j=i;j>=0;j--)
{
if(a[j]>temp)
a[j+1]=a[j];
else
break;
}
a[j+1]=temp;
}
}
find.c文件:
/*----------------------------顺序查找----------------------------*/
#include"locating.h"
/*-----a是数组,length是数组长度,value查找的值-------*/
intfind_array_1(inta[],intlength,intvalue)
{
inti;
for(i=0;iif(a[i]==value)
returni;
return-1;
}
/*------------递归法------------*/
intfind_array_2(inta[],intlength,intvalue)
{
if(0==length)
return-1;
if(a[length-1]==value)
returnlength-1;
find_array_2(a,length-1,value);
}
find_bin.c文件:
/*----------------------------二分法查找------------------------------*/
#include"locating.h"
/*-----a是数组,length是数组长度,value查找的值-------*/
intfind_array_bin_1(inta[],intlength,intvalue)
{
ints=0,e=length-1,m;
while(s<=e)
{
m=(s+e)/2;
if(a[m]s=m+1;
if(a[m]>value)
e=m-1;
if(a[m]==value)
returnm;
}
return-1;
}
/*-----------递归法----s是数组起始下标,e结束下标---*/
intfind_array_bin_2(inta[],ints,inte,intvalue)
{
staticintm;
if(s>e)
return-1;
m=(s+e)/2;
if(a[m]s=m+1;
if(a[m]>value)
e=m-1;
if(a[m]==value)
returnm;
returnfind_array_bin_2(a,s,e,value);
}
print.c文件:
/*---------------------------打印--------------------------------*/
#include"locating.h"
voidprint_array(inta[],intn)//a是数组名,n是元素个数
{
inti=0;
for(i=0;iprintf("a[%d]=%d\n",i,a[i]);
}
main.c文件:
#include"locating.h"
#include"func.h"
/*--主函数可以自己写,这边重复数字,只要找到就输出其中一个,有能力请自己完善--*/
intmain(intargc,char*argv[])
{
inta[N],i,k,n;
init_array(a,N);
insert_sort(a,N);
print_array(a,N);
for(i=0;i{
k=random()%N;
n=find_array_bin_2(a,0,N-1,k);
if(n==-1)
printf("无此节点!
\n");
else
printf("数值=%d,数组下标=%d\n",k,n);
}
return0;
}
到了最主要的程序makefile的编写:
(1)方法一(普通):
socating:
init.osort_a.ofind.ofind_bin.oprint.omain.o
gccinit.osort_a.ofind.ofind_bin.oprint.omain.o-osocating
init.o:
init.clocating.h
gcc-cinit.c
sort_a.o:
sort_a.clocating.h
gcc-csort_a.c
find.o:
find.clocating.h
gcc-cfind.c
find_bin.o:
find_bin.clocating.h
gcc-cfind_bin.c
print.o:
print.clocating.h
gcc-cprint.c
main.o:
main.clocating.hfunc.h
gcc-cmain.c
clean:
rminit