【Linux程序设计】之Linux库函数的使用,多文件程序开发,静态与共享函数

时间:2021-10-23 10:21:03

这个系列的博客贴的都是我大二的时候学习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));
}

 

二、静态库的制作

将上述“一”程序中的函数mysqrtmypow制作成静态函数库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的共享库)

 

 

三、动态共享库的制作

将上述“一”程序中的函数mysqrtmypow制作成动态共享函数库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