【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\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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程微刊

前端菜鸟之SASS入门笔记

Sass 是成熟、稳定、强大的 CSS 扩展语言。sass是需要编译的,sass不能直接用于页面。它可以提高编程效率(对于使用熟练的人来说)。

11020
来自专栏九彩拼盘的叨叨叨

写出好的前端代码不是件容易事

什么样的代码算是好代码? 在我看来,易于维护的代码就是好代码。当然代码还可以从性能,安全等方面来考量。这些不在本文的讨论范围之内。

9030
来自专栏草根专栏

Python数据分析(一): ipython 技巧!

不一定非得使用Jupyter Notebook,试试ipython命令行 安装 ipython 我只试过Windows 10环境下的。 1.安装python安装...

38860
来自专栏程序员的知识天地

1000多个项目中的十大JavaScript错误以及如何避免

通过统计数据库中的1000多个项目,我们发现在 JavaScript 中最常出现的错误有10个。下面会向大家介绍这些错误发生的原因以及如何防止。

14130
来自专栏测试驿栈

Jmeter(二十五)_Xpath关联

在Jmeter中,除了正则表达式可以用作关联,还有一种方式也可以做关联,那就是 XPath Extractor。它是利用xpath提取出关键信息,传递变量。

17640
来自专栏高性能服务器开发

libevent源码深度剖析(六) 初见事件处理框架

(1)libevent源码深度剖析一 序 (2)libevent源码深度剖析二 Reactor模式 (3)libevent源码深度剖析三 libevent基...

24320
来自专栏python全栈布道师

使用python读取和写入Excel

45660
来自专栏用户画像

逻辑覆盖 测试题

(2)  简述什么是测试用例。白盒测试的动态测试要根据程序的控制结构设计测试用例简述其原则。

11620
来自专栏人工智能LeadAI

TensorFlow的Debugger调试实例

之前有翻译整理过关于TensofFlow的Debugger的简单教程,具体内容见这里(https://www.jianshu.com/p/9fd237c7fda...

44690
来自专栏Golang语言社区

Go语言的管道Channel用法实例

本文实例讲述了Go语言的管道Channel用法。分享给大家供大家参考。具体分析如下: channel 是有类型的管道,可以用 channel 操作符 <- 对其...

40250

扫码关注云+社区

领取腾讯云代金券