这个系列的博客贴的都是我大二的时候学习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. 第12章 使用Samba或NFS实现文件共享

    章节简述: 本章节为读者讲述文件共享系统的作用,了解Samba与NFS服务程序的开发背景以及用法. 详细逐条讲解Samba服务配置参数,演示安全共享文件的配置策方法,并使用autofs服务程序自动挂载 ...

  2. android获取手机信息大全

    IMEI号,IESI号,手机型号: private void getInfo() { TelephonyManager mTm = (TelephonyManager) getSystemServic ...

  3. 如何高效利用GitHub

    是Github,让社会化编程成为现实.本文尝试谈谈GitHub的文化.技巧与影响. Q1:GitHub是什么 Q2:GitHub风格 Q3: 在GitHub,如何跟牛人学习 Q4: 享受纯粹的写作与演 ...

  4. Delphi经验总结(2)

    Q: 怎么来改变ListBox的字体呢?就修改其中的一行. A: 先把ListBox1.Style 设成lbOwnerDrawFixed 然后在 OnDrawItem 事件下写下如下代码 proced ...

  5. 51nod 1264 线段相交

    题目:传送门. 题意:给两条线段,有一个公共点或有部分重合认为相交,问他们是否相交. 题解:这属于非规范相交的情况,模板题. #include <iostream> #include &l ...

  6. HDU1695 GCD (欧拉函数+容斥原理)

    F - GCD Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  7. [Linux] 孤儿进程与僵尸进程[总结]

    转载: http://www.cnblogs.com/Anker/p/3271773.html 1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两 ...

  8. 谈Web前端安全编码

    最近开发中涉及到有关输出正确的HTML标签这样的问题,正好对字符编码这块儿多看看,之前对这个方面认识的不深,思考的确实不够,如果下次再碰见类似的问题,若再次不少时间去调研的花,就得不偿失了. 就像正则 ...

  9. static_cast, dynamic_cast, const_cast

    http://www.cnblogs.com/chio/archive/2007/07/18/822389.html 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1 ...

  10. POSIX线程

    大多数线程函数以pthread_开头,.h为pthread.h,   用-lpthread来链接线程库. 编写多线程时,定义宏_REENTRANT告诉编译器需要可重入,此宏必须位于任何#include ...