实验四 Linux系统C开发工具的使用
学号:6130116217
专业班级:计算机科学与技术165班
课程名称:Linux程序设计实验
一、实验项目名称
Linux系统C开发工具的使用
二、实验目的
熟悉Linux 系统开发工具的使用
三、实验基本原理
1.程序的编辑、编译、运行和调试过程
2.库的建立与使用
四、主要仪器设备及耗材
硬件: PC机;
软件:WindowsOS,VMware,Fedora10.0或其他Linux发行版。
五、实验步骤
1.程序的编辑、编译、运行与调试
(1)编辑源程序:tst.c
#include <stdio.h>
int func(int n)
{
int sum=0,i;
for(i=0; i<n; i++)
{
sum+=i;
}
return sum;
}
int main()
{
int i;
long result = 0;
for(i=1; i<=100; i++)
{
result += i;
}
printf("result[1-100] = %d \n", result );
printf("result[1-250] = %d \n", func(250) );
return 0;
}
(2) 编译生成执行文件
[root@localhost ~]# gcc -g tst.c -o tst
(注意必须有 –g 参数,否则执行代码无调试信息)
(3) 执行程序
[root@localhost ~]# ./tst
result[1-100] = 5050
result[1-250] = 31125
(4)使用gdb进行C语言级调试
[root@localhost ~]# gdb tst <---------- 启动gdb
使用命令l查看源代码,一次十行
b 21设置断点
Info b查看断点信息
r开始运行程序
p命令查看变量i与result的值
set命令设置变量值
set result=2019
p result
n(next)或者s(step)命令单步运行若有函数,调试时s会进入函数,n不会。
查看完变量或堆栈,输入c命令恢复程序正常运行
q(quit)命令推出gdb环境
2. 库的建立与使用
设计一个程序,统计学生的成绩,包括成绩的最大值、最小值、总和以及平均值。
(1)建立C程序 mymax.c
#include<stdio.h>
double max;
double mymax(double a[],int n)
{
max=a[1];
for(int i=2; i<=n; ++i)
if(a[i]>max)
max=a[i];
return max;
}
(2)建立C程序 mymin.c
#include<stdio.h>
double min;
double mymin(double a[],int n)
{
min=a[1];
for(int i=2; i<=n; ++i)
if(a[i]<min)
min=a[i];
return min;
}
(3)建立C程序 mysum.c
#include<stdio.h>
double sum;
double mysum(double a[],int n)
{
for(int i=1; i<=n; ++i)
sum+=a[i];
return sum;
}
(4)建立C程序 myavg.c
#include<stdio.h>
#include"my.h"
double avg;
double myavg(double a[],int n)
{
for(int i=1; i<=n; ++i)
avg+=a[i];
avg/=n;
return avg;
}
(5)建立C程序 my.h
#ifndef MY_H_INCLUDED
#define MY_H_INCLUDED
double mymax(double *a,int n);
double mymin(double a[],int n);
double mysum(double a[],int n);
double myavg(double a[],int n);
#endif // MY_H_INCLUDED
(6)建立C程序 mymain.c
#include<stdio.h>
#include"my.h"
int n,i;
double a[2019];
int main()
{
printf("Please input the number of students: \n");
scanf("%d",&n);
printf("please input the grades of students: \n");
for(i=1; i<=n; ++i)
scanf("%lf",&a[i]);
printf("max:%lf \n",mymax(a,n));
printf("min:%lf \n",mymin(a,n));
printf("sum:%lf \n",mysum(a,n));
printf("avg:%lf \n",myavg(a,n));
return 0;
}
(7)建立静态库libmylib.a
(8)编译mymain.c程序
(9)执行mymain程序
3.将上述2中的程序利用make工程管理器进行编译
编辑makefile
mymain:mymain.o mymax.o mymin.o mysum.o myavg.o
gcc -o mymain mymain.o mymax.o mymin.o mysum.o myavg.o
mymax.o:mymax.c
gcc -c mymax.c
mymin.o:mymin.c
gcc -c mymin.c
mysum.o:mysum.c
gcc -c mysum.c
myavg.o:myavg.c
gcc -c myavg.c
mymain.o:mymain.c
gcc -c mymain.c
make编译
./mymain执行
六、实验数据及处理结果
对实验结果截图并给出实验总结。
七、思考讨论题
1. 对比共享库和静态库的差异
https://cloud.tencent.com/developer/article/1344879
答:
①静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大。
动态库(共享库)的代码在可执行程序运行时才载入内存,在编译过程中仅简单的引用,因此代码体积比较小。
②静态库和动态库的最大区别,静态情况下,把库直接加载到程序中,而动态库链接的时候,它只是保留接口,将动态库与程序代码独立,这样就可以提高代码的可复用度,和降低程序的耦合度。
③静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在
④静态库有一个缺点,当同时运行的许多应用程序都使用来自同一个函数库的函数时,就会在内存中有同一函数的多份拷贝文件,且程序文件自身也有多份同样的拷贝。这将大量消耗宝贵的内存和磁盘空间。共享库克服了这种不足,可以用来实现函数的动态链接。
2. 设计并完成一个Makefile文件,用于编译若干个.C文件。
Makefile3-10文件如下:
3-10:mymain.o mysum.o myavg.o mymax.o mymin.o
gcc mymain.o mysum.o myavg.o mymax.o mymin.o -o 3-10
mymain.o: mymain.c my.h
gcc mymain.c -c
mymax.o:mymax.c
gcc mymax.c -c
mymin.o:mymin.c
gcc mymin.c -c
mysum.o: mysum.c
gcc mysum.c -c
myavg.o: myavg.c
gcc myavg.c -c
八、参考资料
1.金国庆等,Linux程序设计(第二版),浙江大学出版社,2014年4月
2. Neil Matthew,《Linux程序设计》(第4版), 人民邮电出版社,2014年9月
3. 杨宗德,《Linux高级程序设计》(第三版),人民邮电出版社,2012年11月
4. Daniel P.,《深入理解Linux内核》(第三版),中国电力出版社,2013年1月