《Linux操作系统》实验十-UNIX gcc编译器的使用与编程环境

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档