实验:gcc编译器的使用与编程环境.doc_第1页
实验:gcc编译器的使用与编程环境.doc_第2页
实验:gcc编译器的使用与编程环境.doc_第3页
实验:gcc编译器的使用与编程环境.doc_第4页
实验:gcc编译器的使用与编程环境.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验:编译器使用与make1、实验目的(1)掌握gcc和g+的用法;(2)了解目标代码、库函数的使用;(3)掌握静态库和共享库的构造与使用;(4)掌握多模块和多语言联合开发方法;(5)掌握make命令和Makefile文件的使用。2、实现设备一台装有Windows操作系统和Linux机系统的微机或服务器。3、实验方法与注意事项实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。要按通常实验要认真书写实验报告。4、实验过程1) helloworld程序(1)C语言版helloworld.c#include main() printf(Hello C World!n);编译及运行方法:(注意观察各编译参数的意义及作用,最后通过命令ls l a.out hello*来观察所生成文件的不同,为什么会这样?)cc c hello.c#生成目标文件hello.occ S hello.c#生成汇编程序hello.scc hello.c#生成可执行程序a.outcc o hello hello.c#生成可执行程序hellocc s o hello_s hello.c#生成汇编程序hello.scc o hello_st hello.c -static#生成可执行程序hello_stcc o hello_sh hello.c -shared#生成可执行程序hello_shcc o hello_rd hello.c -rdynamic#生成可执行程序hello_rd(2)C+版helloworld.C(可参照(1)进行编译,搞清楚参数的意义及作用)#includeusing namespace std;main() coutHello, C+ World! endl;可以像使用gcc一样,使用c+或g+来编译它:g+ hello.C#生成可执行程序a.outc+ o hello hell.C#生成可执行程序hellog+ s -o Hello hello.C#生成删除符号表的可执行程序Hello也可以使用gcc并指定库文件来编译c+程序:gcc c hello.C#生成目标文件hello.ogcc o h hello.C lstdc+#指定标准c+库,生成可执行程序h也参照标准c的编译方法以不同形式编译c+程序和helloworld.C。(3) JAVA版的Helloworld程序public class HelloWorld public static void main(String argv) System.out.println(Hello JAVA World!); 编译与执行方法:在没有安装JDK的情况下,可使用gcc-java软件包中的gcj编译,使用gij执行,方法如下gcj -C -classpath /usr/share/java/libgcj*.jar HelloWorld.java # 生成字节码gij HelloWorld# 执行在已经安装JDK的情况下,可以使用javac编译,用java执行,方法如下javac HelloWorld.java # 生成字节码java HelloWorld# 执行说明:可以从Linux/Unix系统的发布资源库中安装JDK,也可以从Oracle的官方网站上下载并安装JDK,但要选择合适的版本。若使用前者,方法如下:yum install openjdk(3) PHP版的Helloworld程序设有PHP脚本程序helloworld.php内容如下: Hello PHP World! My Apache Server is Running! ?phpecho I am from PHP ! ;?可在Linux下按如下方法“执行“它: 安装httpd服务器(若已经安装,则不再做)yum install httpd 启动httpd服务器(若已经启动,则不再做)service httpd restart# Fedors 15 以前版本,比如Fedora/Linuxsystemctl restart httpd.service 在浏览器地址栏输入: http:/ip/helloworld.php2) 多模块组合开发与编译、静态库的构造与使用仅以C语言为例说明之。设一个工程,有3个模块f1.c、f2.c和f3.c,f3.c中包含了main()函数。它们的内容分别为:#include int printSTR(char *str) printf(%s,str);图1 file1.c程序清单#include int printINT(int i) printf(%dn,i);int add2(int x, int y) return x + y;图2 file2.c程序清单#include main() printSTR(This is a test string ); printINT(add2(2,3);图3 file3.c程序清单编译和连接过程如下:cc -c file1.c file2.c/ 生成 file1.o 和 file2.occ -S file1.c file2.c/ 生成 file1.s 和 file2.scc file3.c file1.c file2.c / 生成a.outcc -o mp file3.c file1.o file2.o / 生成mp3) 静态库的构造与使用静态库构造对于以上工程中,使用file1.c和file2.c构造静态库的方法如下用file1.c和file2.c生成libmyl.a的过程如下:# gcc -c file1.c file2.c# 生成目标模块# ar crv libmyl.a file1.o file2.o# 构造静态库# ranlib libmyl.a# 构建索引表(若创建库时未使用-S,可不做此步)非标准静态库的使用libmyl.a是我们自己构造,不是标准库。对于非标准库,需要使用-l指定库名,-L指定库文件位置。a)库文件libmyl.a在标准位置(/lib或/usr/lib)$ gcc -o myprog file3.c l myl# 非标准库,需用-l指定库名b)库文件不在标准位置,比如在当前目录$ gcc -o myprog libmyl.a# 直接使用静态库文件(一般不这样做)$ gcc -o myprog file3.c -L. -l myl# -L指定位置,-l指定库名4) 共享库的构造与使用共享库构造对于以上工程中,使用file1.c和file2.c构造共享库libmydl.so的方法如下# gcc -fpic -c file1.c file2.c # 首先生成目标文件(Solaris下-fpic必须) 或# gcc -fPIC -c file1.c file2.c # 首先生成目标文件(Solaris下-fPIC必须)# ld -shared -o libmydl.so file1.o file2.o # 链接生成共享库libmydl.so# gcc -shared -o libmydl.so file1.o file2.o # 同上共享库生成之后,就可以使用了。若是为了方便起见,可将新生成的共享库移动或复制到库文件的标准位置(然后再运行ldconfig)就可以了。比如cp libmydl.so /usr/libldconfig共享态库的使用为了使用共享库,在编程时,首先要对共享库的函数进行声明,此时,它们的类型不变,但声明为指针型的。将file3.c改为file3dl.c的示例如下。#include #include #include main() void *dlfp; / 定义文件描述符 char *error; / 定义错误指针 int (*add2)(int,int),(*printSTR)(char *),(*printINT)(int);/声明函数类型 dlfp=dlopen(libmydl.so,RTLD_LAZY); / 打开共享库 if(dlfp=NULL) / 若失败 fprintf(stderr,%sn,dlerror(); exit(1); add2=dlsym(dlfp,add2);/ 获取函数add2()入口 if(error=dlerror()!=NULL) / 若失败 fprintf(stderr,add2: %sn,error); exit(2); printSTR=dlsym(dlfp,printSTR);/ 获取函数printSTR()入口 if(error=dlerror()!=NULL) / 若失败 fprintf(stderr,printSTR: %sn,error); exit(3); printINT=dlsym(dlfp,printINT);/ 获取函数printINT()入口 if(error=dlerror()!=NULL) / 若失败 fprintf(stderr,printINT: %sn,error);exit(4); printSTR(This is a test stringn);/ 调用函数printSTR() printINT(add2(2,3); / 调用函数printINT()和add2() dlclose(dlfp); / 关闭共享库文件 exit(0); / 正常退出使用共享库libmydl.so编译file3dl.c过程如下gcc file3dl.c -o file3dl # FreeBSD & Solarisgcc file3dl.c -o file3dl -ldl# Fedora Linux5) Makefile的编写与使用(1)针对2)的Makefile文件file1.o: file1.cgcc -c file1.c# 此行首为1键,以后不再说明file2.o: file2.cgcc -c file2.cfile3.o: file3.cgcc -c file3.cmyproc: file1.o file2.o file3.ogcc -o myproc file1.o file2.o file3.o用法为make file1.o# 生成file1.omake file2.o# 生成file2.omake file3.o# 生成file3.omake file1.o file2.o file3.o # 生成file1.o、file2.o和file3.omake myproc# 生成myproc(2)添加clean、install和unstall之后的Makefile文件。CC = gcc # 指定C语言编译器SRC = file1.c file2.c # 源程序文件SRC += file3.cOBJ = $(SRC:.c=.o) # 目标文件dst = myprog # 要生成的可执行程序all: $(dst) # 整个工程伪目标$(dst): $(OBJ) # 最后产品myproc生成规则$(CC) -o $ $(OBJ) # 此行首为1键,以后不再说明%.o: %.c # 目标文件生成规则$(CC) -c $/dev/null 2&1install: all # 安装:先编译整个工程,再将myproc复制到/usr/bincp $(dst) /usr/binuninstall: # 删除/usr/bin/myprocrm /usr/bin/$(dst) /dev/null 2&1此改造后的makefile,可以生成目标程序file1.o、file2.o、file3.o和可执行程序myprog。若将它命名为makefile1,使用它进行编译的方法如下:$ make f makefile1 file1.o; m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论