这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的。贴出来纯粹是聊胜于无。
实验题目:Linux基础程序设计综合实验
实验目的:熟悉并掌握Linux库函数的使用,多文件程序开发,静态与共享函数库的制作,Makefile文件编写以及gdb调试等。
一、基于库函数使用的多文件程序开发
设计程序,满足如下要求:
1、程序包含5个文件,myfirst.c, mysqrt.c, mysqrt.h, mypow.c mypow.h
2、myfirst.c为主程序,其能够通过函数mysqrt和mypow的调用实现平方根和指数运算。
3、函数mysqrt能够实现:1)输入非负整数;2)输出输入整数的平方根;其中,mysqrt.h包含函数mysqrt声明,mysqrt.c包含函数mysqrt的实现。
4、函数mypow能够实现:1)输入两个整数x,y(符合指数运算的数学规范);2)输出xy的值;其中,mypow.h包含函数mypow声明,mypow.c包含函数mypow的实现。
5、使用gcc对程序编译,生成满足题目要求的可执行文件myfirst。注意:编译时,需指定数学函数库。
程序实现:first.c
1 #include "mysqrt.h" 2 #include "mypow.h" 3 4 int main() 5 { 6 mysqrt(); 7 mypow(); 8 return 0; 9 }
mypow.h
void mypow();
mypow.c
#include <stdio.h> #include <math.h> void mypow() { int n1,n2; printf("input n1 & n2\n"); scanf("%d%d",&n1,&n2); printf("pow(%d,%d) is %f\n",n1,n2,pow(n1,n2)); }
mysqrt.h
void mysqrt();
mysqrt.c
#include <stdio.h> #include <math.h> void mysqrt() { int n; printf("please input a num\n"); scanf("%d",&n); printf("the sqrt of %d is %f\n",n,sqrt(n)); }
二、静态库的制作
将上述“一”程序中的函数mysqrt和mypow制作成静态函数库libmyku.a,并使用库libmyku.a重新编译源程序myfirst.c。
首先使用gcc -c mysqrt.c mypow.c 生成 mysqrt.o mypow.o的目标文件
然后使用ar创建一个归档文件并将目标文件添加进去。
ar crv libfoo.a mysqrt.o mypow.o 生成 静态库
现在就可以测试静态库是否制作成功了。
gcc -o program myfirst.o libfoo.a
也可以使用-l 选项来访问函数库,但是因为其未保存在标准位置,所以必须使用-L选项来指示gcc 在何处可以找到它。比如:
gcc - o program myfirst.o -L. -lfoo
-L.选项指示编译器在当前目录下查找函数库,-lfoo选项指示编译器使用名为libfoo.a 的函数库(或者名为libfoo.so的共享库)
三、动态共享库的制作
将上述“一”程序中的函数mysqrt和mypow制作成动态共享函数库libmysku.so,并使用库libmysku.so重新编译源程序myfirst.c。
注意:使用共享库编译和运行源程序时,均需考虑函数库的路径问题。
共享库可以实现函数的动态连接,类似于windows下面的.DLL 的函数动态链接库
gcc -shared -fpic -o libmysku.so mysqrt.c mypow.c
四、Makefile文件编写
编写上述“一”程序的Makefile文件,要求:
1、编写5个规则,每个规则的目标分别为myfirst, myfirst.o, mysqrt.o, mypow.o, clean;
2、使用环境变量表示所有规则中的目标文件和依赖文件;
3、定义并使用如下变量:1)CC为编译指令;2)OPTION为编译选项;3)DEP为myfirst目标的所有依赖文件。
4、规则clean中,删除可执行文件及所有目标文件。
提交:符合上述要求的Makefile文件,并解释符号$@、$<、$^的含义,gcc选项-o, -c, -L, -l, -shared, -g作用,以及什么是隐藏规则。
CC=gcc OPTION=-lm -o DEP=myfirst.o mysqrt.o mypow.c myfirst:${DEP} $(CC) ${OPTION} $@ $^ clean: rm -rf myfirst *.o main