这个系列的博客贴的都是我大二的时候学习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. UIImage imageNamed和UIImage imageWithContentsOfFile区别

    UIImage imageNamed和 [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageNam ...

  2. [转]Spring的IOC原理[通俗解释一下]

    1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机械 ...

  3. 【OpenStack】OpenStack系列13之Nova源码解析与API扩展

    学习思路 议程:代码结构-主干流程-分层架构-业务模型-数据库模型-消息模型 分布式架构:Api:横向扩展    rpc:纵向扩展 分层架构:Controller接口层.View/Manager逻辑层 ...

  4. hadoop(一):深度剖析hdfs原理

    在配置hbase集群将 hdfs 挂接到其它镜像盘时,有不少困惑的地方,结合以前的资料再次学习;  大数据底层技术的三大基石起源于Google在2006年之前的三篇论文GFS.Map-Reduce. ...

  5. Android 返回桌面的Intent

    Intent MyIntent = new Intent(Intent.ACTION_MAIN); MyIntent.addCategory(Intent.CATEGORY_HOME); startA ...

  6. codeforces 475A.Bayan Bus 解题报告

    题目链接:http://codeforces.com/problemset/problem/475/A 题目意思:输入一个整数 k(0 ≤ k ≤ 34),表示participants的人数,需要在一 ...

  7. linux下emacs配置文件

    1:安装.在ubuntu下使用命令 sudo apt-get install emacs,即可,我使用的是ubuntu的10.04的版本,在里面使用了据说是163的2个源. 1.1:如何更新快速的源, ...

  8. 关押罪犯(codevs 1069)

    题目描述 Description S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极 不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨 ...

  9. 自定义viewgroup实现ArcMenu

    最终效果如下 实现思路 通过效果图,会有几个问题: a.动画效果如何实现 可以看出动画是从顶点外外发射的,可能有人说,那还不简单,默认元素都在定点位置,然后TraslateAnimation就好了:这 ...

  10. Redis快速入门:安装、配置和操作

    本文是有关Redis的系列技术文章之一.在之前的文章中介绍了<Redis快速入门:初识Redis>,对Redis有了一个初步的了解.今天继续为大家介绍Redis如何安装.配置和操作. 系列 ...