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

 #include "mysqrt.h"
#include "mypow.h" int main()
{
mysqrt();
mypow();
return ;
}

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

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

  1. linux一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书)

    一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书) --------------------------目录-网络无关篇-目录-------------------------- 0001 修 ...

  2. linux C 刚初始化后的一个变量在调用一个静态库中函数后被异常修改为乱码

    linux C 中声明并初始化一个变量const char a[512]="test";后,接着调用了一个静态库中的函数函数test(b);,a并没有传入test函数,但在调用这个 ...

  3. Linux程序设计之shell程序设计

    看了<linux程序设计(第4版)>(作者:Neil Matthew ,Richard Stones ,陈建 ,宋健建译).做个笔记,以备后面查看. 首先,清楚几个概念. shell编程属 ...

  4. 3)Linux程序设计入门--文件操作

    )Linux程序设计入门--文件操作 Linux下文件的操作 前言: 我们在这一节将要讨论linux下文件操作的各个函数. 文件的创建和读写 文件的各个属性 目录文件的操作 管道文件 .文件的创建和读 ...

  5. 1)Linux程序设计入门--基础知识

    )Linux程序设计入门--基础知识 Linux下C语言编程基础知识 前言: 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编译 Makef ...

  6. Linux程序设计(一)入门

    1. linux程序 Linux应用程序表现为两种特殊类型的文件:可执行文件和脚本文件. 可执行文件:是计算可以直接运行的程序,相当于windows的.exe文件. 脚本文件:一组指令的集合.这些指令 ...

  7. Linux 程序设计的一些优化措施

    Linux 程序设计的一些优化措施 这些知识是在平常的阅读中,零散的获得的,自己总结了一下,分享在这里 全局变量VS函数参数 全局变量在Linux下的驱动编程里边,用的是非常多,例如中断服务函数ISR ...

  8. Linux程序设计:进程通信

      日期:忘了. 关键词:Linux程序设计:System-V:进程通信:共享内存:消息队列. 一.共享内存   1.1 基本知识 (待补充)   1.2 代码 一个基于share memory实现的 ...

  9. 5)Linux程序设计入门--信号处理

    )Linux程序设计入门--信号处理 Linux下的信号事件 前言:这一章我们讨论一下Linux下的信号处理函数. Linux下的信号处理函数: 信号的产生 信号的处理 其它信号函数 一个实例 .信号 ...

随机推荐

  1. [Effective JavaScript 笔记]第6章:库和API设计--个人总结

    前言 又到了一章的总结,这章里的内容.是把我从一个代码的使用者,如何换位成一个代码的编写者.如何让别人用自己的代码更容易,不用去注意太多的无用细节,不用记住冗长的函数名.在使用API时怎样避免使用者会 ...

  2. 在Linux用户空间做内核空间做的事情

    导读 我相信,Linux 最好也是最坏的事情,就是内核空间(kernel space)和用户空间(user space)之间的巨大差别.如果没有这个区别,Linux 可能也不会成为世界上影响力最大的操 ...

  3. 在CentOS 7 上搭建LAMP

    导读 要求:httpd的动态和静态资源分为两台主机提供,mysql也用单独一台主机.httpd服务提供虚拟主机,一个虚拟主机用于提供phpMyAdmin:另一个虚拟主机用于提供wordpress.安装 ...

  4. 国内常用NTP服务器地址及IP

    iptables实现80端口转发到8080端口上 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 ...

  5. django 架构点点滴滴

    前言: 零星发现一些,零星记录一些,因此可能整体比较混乱,因为显然不是一气呵成写的. 关于CBV(Class Based View): 首先吐槽下,cbv的整体继承结构,可真的不是很优美,可以查看这里 ...

  6. Lucas的数论(math)

    Lucas的数论(math) 题目描述 去年的今日,Lucas仍然是一个热爱数学的孩子.(现在已经变成业界毒瘤了> <) 在整理以前的试题时,他发现了这么一道题目:求\(\sum\limi ...

  7. Java--多线程读取网络图片并保存在本地

    本例用到了多线程.时间函数.网络流.文件读写.正则表达式(在读取html内容response时,最好不要用正则表达式来抓捕html文本内容里的特征,因为服务器返回的多个页面的文本内容不一定使用相同的模 ...

  8. 22.整数二进制表示中1的个数[Get1BitCount]

    [题目] 输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. [分析] 如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数 ...

  9. Apache配置文件中的deny和allow的使用

    Apache配置文件中的deny和allow的使用 由于产品的需要,最近在配置apache的负载均衡功能,但是在配置虚拟主机的访问权限的时候我们遇到了一些问题.主要问题是deny和allow的执行顺序 ...

  10. windows和linux下mysql的重启命令

    在 Windows 下: 开始->运行->cmd启动:net start mysql停止:net stop mysql 无重启,必须先停止再启动!!! 在LINUX 下: 启动:/etc/ ...