这个系列的博客贴的都是我大二的时候学习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
#include
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
#include
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文件,并解释符号$@、$
CC=gcc
OPTION=-lm -o
DEP=myfirst.o mysqrt.o mypow.c
myfirst:${DEP}
$(CC) ${OPTION} $@ $^
clean:
rm -rf myfirst *.o main
linux一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书)
一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书) --------------------------目录-网络无关篇-目录-------------------------- 0001 修 ...
linux C 刚初始化后的一个变量在调用一个静态库中函数后被异常修改为乱码
linux C 中声明并初始化一个变量const char a[512]="test";后,接着调用了一个静态库中的函数函数test(b);,a并没有传入test函数,但在调用这个 ...
Linux程序设计之shell程序设计
看了(作者:Neil Matthew ,Richard Stones ,陈建 ,宋健建译).做个笔记,以备后面查看. 首先,清楚几个概念. shell编程属 ...
3)Linux程序设计入门--文件操作
)Linux程序设计入门--文件操作 Linux下文件的操作 前言: 我们在这一节将要讨论linux下文件操作的各个函数. 文件的创建和读写 文件的各个属性 目录文件的操作 管道文件 .文件的创建和读 ...
1)Linux程序设计入门--基础知识
)Linux程序设计入门--基础知识 Linux下C语言编程基础知识 前言: 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编译 Makef ...
Linux程序设计(一)入门
1. linux程序 Linux应用程序表现为两种特殊类型的文件:可执行文件和脚本文件. 可执行文件:是计算可以直接运行的程序,相当于windows的.exe文件. 脚本文件:一组指令的集合.这些指令 ...
Linux 程序设计的一些优化措施
Linux 程序设计的一些优化措施 这些知识是在平常的阅读中,零散的获得的,自己总结了一下,分享在这里 全局变量VS函数参数 全局变量在Linux下的驱动编程里边,用的是非常多,例如中断服务函数ISR ...
Linux程序设计:进程通信
日期:忘了. 关键词:Linux程序设计:System-V:进程通信:共享内存:消息队列. 一.共享内存 1.1 基本知识 (待补充) 1.2 代码 一个基于share memory实现的 ...
5)Linux程序设计入门--信号处理
)Linux程序设计入门--信号处理 Linux下的信号事件 前言:这一章我们讨论一下Linux下的信号处理函数. Linux下的信号处理函数: 信号的产生 信号的处理 其它信号函数 一个实例 .信号 ...
随机推荐
web测试方法
首先互联网B/S系统一般分为三层,即表示层.业务逻辑层.数据层,下面是我整理的关于web的测试方法. 表示层 一.功能测试 1.链接测试 确认每个链接有效且正确跳转 2.表单测试 确认表单能正常提交, ...
Node创建TCP聊天
//创建新的tcp服务器var net = require('net');var chatServer = net.createServer()chatServer.on('connection',f ...
Android invalidate() 和 postInvalidate()的区别
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中 ...
转载 jQuery validation
之前做客户端验证感觉自己javascript 不行,虽然能写出来一完整的验证,但从不自信,一直觉得客户端验证是比较繁琐的事情,但是又不能不做,只到最开始接触ajax ,遇到了一个jQuery vali ...
Moses 里的参数(未完成)
老师要求看看Moses里都有什么参数,调整了参数又会对翻译结果有什么影响,先将找到的参数列出来 首先是权重: [weight] WordPenalty0= LM= Distortion0= Phras ...
android webview内容压线问题解决方法
最近在使用webview做页面开发,项目上要求webview在获取到焦点的时候需要有边框线,于是添加上了webview的选中效果,但是出现了网页中的内容压选中框的情况.之后给webview添加padd ...
【转】jsoncpp在xcode中的使用
http://blog.csdn.net/ashqal/article/details/8573392 考虑到cocos2dx需要使用jsoncpp做关卡的设置, 尝试用源代码直接放到项目以方便后期生 ...
String属于“假引用类型”,代码为证(一个String引发的血案...)
一直以为String是引用类型,今天写了个浅拷贝的测试,发现String有基本类型的特征. class A{ public int a = 555; } class User implements C ...
js 对url进行某个参数的删除,并返回url
两种情况 1对当前页面的url进行操作 function funcUrlDel(name){ var loca = window.location; var baseUrl = loca.origin ...
input的三个属性autocomplete、autocapitalize和autocorrect
下面的input的三个属性是H5新增的属性