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


    这个系列的博客贴的都是我大二的时候学习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
    ");
        scanf("%d%d",&n1,&n2);
        printf("pow(%d,%d) is %f
    ",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
    ");
        scanf("%d",&n);
        printf("the sqrt of %d is %f
    ",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
  • 相关阅读:
    20155227 《Java程序设计》实验四 Android开发基础设计实验报告
    20155227第十二周课堂实践
    2016-2017-2 20155227实验三《敏捷开发与XP实践》实验报告
    20155227 2016-2017-2 《Java程序设计》第十周学习总结
    2016-2017-2 20155227实验二《Java面向对象程序设计》实验报告
    20155226 实验三 敏捷开发与XP实践 实验报告
    20155226 mini DC 课堂测试补交
    20155226 2016-2017-2 《Java程序设计》第10周学习总结
    2015526 《Java程序设计》实验二实验报告
    20155226 2016-2017-2 《Java程序设计》第9周学习总结
  • 原文地址:https://www.cnblogs.com/msxh/p/4934412.html
Copyright © 2020-2023  润新知