《Linux操作系统》实验十-UNIX gcc编译器的使用与编程环境
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《Linux操作系统》
实验报告
实验十:UNIX gcc编译器的使
用与编程环境
一、实验目的
(1)掌握gcc和g++的用法;
(2)了解目标代码、库函数的使用;
(3)掌握静态库和共享库的构造与使用;
(4)掌握多模块和多语言联合开发方法;
(5)掌握make命令和Makefile文件的使用。
二、实验环境
一台装有Windows操作系统PC机,上装有虚拟机系统VMWare,实验过程通过VMWare系统启Linux系统工作。
三、实验内容与实验过程及分析
一、C/C++编程
1、C语言版“Hello World”
用vi编辑一个名为hello.c的文件,其内容为
#include
main()
{
printf(”Hello World! C\n”);
}
编译并执行程序。
编译方法为:
cc hello.c // 生成可执行程序 a.out
cc –o hello hello.c // 生成可执行程序hello
cc –c hello.c //生成目标文件hello.o
cc –S hello.c //生成汇编语言程序hello.s
执行程序:
./a.out #执行当前目录内,刚编译生成的a.out程序
./hello #执行当前目录内,刚编译生成的hello程序
2、组合编程
设有C语言文件f1.c,内容为:
#include
f1(int arg){
printf(”f1: you passed %d\n”,arg);
}
C语言文件f2.c。内容为:
#include
f2(char *arg){
printf(”f2: you passed %s\n”,arg);
}
C语言文件m.c。内容为:
#include
main(){
f1(16);
f2(”Hello World!”);
}
请使用vi编辑并生成以上程序,分别用以下方法编译,观察生成文件或运行生成的可执行程序:
cc –c f1.c f2.c #生成 f1.o 和 f2.o
cc –S f1.c f2.c # 生成 f1.s 和 f2.s;可用vi或cat查看它们的内容cc –o mp m.c f1.c f2.c # 生成mp,执行方法为:./mp
cc –o m m.c f1.o f2.o # 生成m,执行方法为:./m
构造自己的静态库
cc –o f1.c f2.c //生成目标文件f1.o, f2.o ar crv libmyl.a f1.o f2.o //生成库libmyl.a
ranlib libmyl.a //为子函数建立内容表
使用自己的库
cc –o mp m.c libmyl.a // 使用库libmyl.a
cc –o mp m.o libmyl.a // 使用库libmyl.a和m.o cc –o mp m.c -L. –lmyl // 在当前目录以默认方法使用库myl
3、构造可共享库
cc -c f1.c f2.c //生成目标文件cc -shared -o libmy.so f1.o f2.o //由目标文件生成共享库
或cc -shared –o libmy.so –c f1.c f2.c//由源文件生成共享库
4、使用共享库
//设以下程序的文件名为f3.c,f1.c和f2.c如前
#include
#include
#define SO_FILE "./libmy.so"
//共享库libmy.so被限定在当前目录,也可放在标准位置,但要使用ldd和ldconfig 处理
main()
{
void *sfp; char *err;
int tmpi=16;
int (*f1)(int ),(*f2)(char *); //定义函数指针
sfp=dlopen(SO_FILE,RTLD_LAZY); //打开共享库
if(sfp==NULL){
fprintf(stderr,dlerror()); exit(1);
}
f1=dlsym(sfp,"f1"); //获取函数f1入口地址(指针)
err=dlerror(); //检查是否成功
if(err){
fprintf(stderr,err); exit(2);
}
f2=dlsym(sfp,"f2"); //获取函数f2入口地址(指针)
err=dlerror(); //检查是否成功
if(err){
fprintf(stderr,err); exit(3);
}
fprintf(stderr,"-----------begine-------------\n");
f2("Test String"); //调用函数f2
f1(tmpi); //调用函数f1
fprintf(stderr,"++++++++++++end+++++++++++++++\n");
dlclose(sfp); //关闭共享库exit(0);
}
5、Makefile的编写与使用
(1)针对2)的Makefile文件
a.Makefile文件的构造
f: f1.o f2.o f3.o
gcc -o f f1.o f2.o f3.o
f1.o: f1.c
gcc –c f1.c
f2.o: f2.c
gcc –c f2.c
f3.o: f3.c
gcc –c f3.c