实验一 LINUX编程环境

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第一章 Linux 基础(2学时)
实验一 LINUX编程环境
实验目的
1.熟悉Linux下C语言程序设计的基本步骤
2.掌握gcc编译器的各种参数的使用方法
3.掌握gcc编译器创建函数库的方法
4.掌握gdb调试程序的方法
5.掌握多文件编译中的makefile的用法
实验内容
1.编辑以下程序,按要求编译运行。

#include <stdio.h>
int main(void)
{
double counter;
double result;
double temp;
for (counter = 0; counter < 4000.0 * 4000.0 * 4000.0 / 20.0 + 2030;counter += (5 - 3 +2 +
1 ) / 4)
{
temp=counter/1239;
result=counter;
}
printf("运算结果是:%lf\n", result);
}
实验步骤和要求:
(1)分别利用gcc的预处理,编译,汇编,链接命令生成example.i,example.s,example.o文件,分别用ls命令显示,要求有相应的命令和截图;
(2)分别使用不同的优化选项O0~O3,进行编译生成可执行程序m0~m3,然后使用time命令统计程序的运行,如time. /m0,比较运行时间。

要求有运行截图和必要的分析。

分析:首先我们要知道-O0表示没有优化,-O1为缺省值,-O3优化级别最高,通过运行结果我们可以看出-O0相比其他能够提高可执行文件的执行效率,但是,编译、连接的速度就相应地要慢一些。

- O1~ O3:比- O0 的优化级别更高,能更好的优化编译、连接。

但整个编译、连接过程会更长。

2.编写如下程序hello.h,hello.c,main.c,将源程序
hello.h:
void hello(const char *name);
hello.c
#include<stdio.h>
void hello(const char *name)
{ printf(“hello %s”,name);
}
main.c
#include“hello.h”
int main()
{ hello(“everyone”);
return 0;
}
实验步骤和要求(要求每一步都要有运行截图):
(1)分别编辑以上三个源程序;
(2)利用gcc –c命令将hello.c编译成.o文件,并用ls命令查看。

(3)利用以下命令,将.o文件创建静态库,并用ls查看。

ar crv libmyhello.a hello.o
注:静态库的命名规范是以lib为前缀,紧跟静态库名,扩展名为.a
(4)在程序中调用生成的静态库文件,运行程序查看输出结果。

gcc -o hello main.c -L. –lmyhello
./hello
(5)删除库文件libmyhello.a,再运行hello程序,测试hello程序是否链接了该库文件。

删除库文件libmyhello.a后
(6)创建动态函数库,得到动态库文件libmyhello.so,并用ls命令查看。

gcc -shared -fPIC -o libmyhello.so hello.o
(7)使用动态函数库,运行程序,观察运行结果。

gcc -o hello main.c -L. -lmyhello
若出错,执行mv libmyhello.so /usr/lib
思考:1.若同时生成同名的静态库和动态库文件,gcc命令会调用哪个库文件?当静态库和动态库同名时, gcc命令将优先调用动态库。

2.总结如何创建函数库,静态库和动态库有何区别.
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

3.设计一程序,要求计算输入的整数的平均值,将程序分成多个文件编译(main.c,average.c,average.h),并编写makefile文件;用make编译后改成返回最小值再编译,分析有多少文件不需重新编译。

实验步骤和要求(要求每一步都要有运行截图):
要求有源程序和make文件以及运行的截图
//main.c
#include "average.h"
main()
{ float a,b,ave;
float average(float a,float b);
ave=average(a,b);
}
//average.c
#include<stdio.h>
float average(float a,float b)
{ float ave;
scanf("%f,%f",&a,&b);
ave=(a+b)/2;
printf("average is %f\n",ave);
return(ave);
}
//average.h
float average(float a,float b);
Makefile
#It is an example for describing makefile edit:main.o average.o
gcc -o edit main.o average.o
main.o: main.c average.h
gcc -c main.c
average.o:average.c average.h
gcc -c average.c
修改average.c
#include<stdio.h>
float average(float a,float b)
{ float ave;
scanf("%f,%f",&a,&b);
if (a>b)
ave=b;
else ave=a;
printf("最小值 is %f\n",ave);
return(ave);
}。

相关文档
最新文档