liunx分文件编程,静态库,动态库的引入

分文件编程的好处:
a.功能责任划分
b.方便调试
c.主程序简洁
在这里用一个简单的计算机程序来示例
首先我们将计算机的主程序math.c编写好

#include<stdio.h>//<>默认会优先从 /usr/inclued/去寻找头文件
#include"mathfun.h"//使用双引号表示优先从当前路径去寻找这个头文件
int main()
{	
	int a;
	int b;
	int ret;
	float ret2;
	printf("请输入第一个加数\n");
	scanf("%d",&a);
	printf("请输入第二个加数 \n");
	scanf("%d",&b);
	
	ret = add(a,b);
	printf("%d+%d=%lf \n",a,b,ret);
	
	ret = jian(a,b);
	printf("%d-%d=%d\n",a,b,ret);
	
	ret=cheng(a,b);
	printf("%d*%d=%d\n",a,b,ret);

	ret2 =chu(a,b);
	printf("%d/%d =%f \n",a,b,ret2);

	return 0;
}

然后我们将加减程序写到另一个文件mathfun.c中

int add(int x,int y)
{
	return x+y;
}


int jian(int x,int y)
{
	return x-y;
}

int cheng(int x,int y)
{
	return x*y;
}

float chu(int x,int y)
{
	return (float)x/y;
	
}

并且对这些函数进行声明,生成mathfun.h的头文件加入到主程序(math.c)中

int add(int a,int b);

int jian(int a,int b);

int cheng(int a,int b);

float chu(int a,int b);

执行结果
在这里插入图片描述

库的引入

优秀博文参考:
https://www.cnblogs.com/sunsky303/p/7731911.html
https://blog.csdn.net/wk_bjut_edu_cn/article/details/81735956
在这里插入图片描述

库是什么

库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容

静态库

静态函数库,是在程序执行前(编译)就加入到目标程序中去了 ;
优点: 运行快
发布程序无需提供静态库,因为已经在app中,移植方便
缺点:程序大
在这里插入图片描述

动态库

动态库
动态函数库,是在程序执行时动态(临时)由目标程序去调用
缺点: 运行慢
优点:程序小
在这里插入图片描述

库的制作和使用

静态库的制作:格式xxxx.a

  1. gcc mathfun.c -c 生成xxx.o文件
    在这里插入图片描述

  2. ar rcs libmathfuns.a mathfun.o ————xxx.o文件生成xxx.a静态库文件
    名字是什么没关系,但要使用lib开头
    静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名。
    在这里插入图片描述
    这个时候我们就可以将mathfun.c和mathfun.o 移除了,因为并不需要使用到(当然不移也是可以的)这边只是接受一下如何把程序移到工作目录
    * ——表示通配符,表示将所有已mathfun开头的文件全部移到工作目录下,但要注意不能把mathfun.h也移走了,这个得留下
    ~——表示工作目录就是 /home/pi/
    在这里插入图片描述
    静态库的使用
    gcc math.c -lmathfun -L ./ -o mainProStatic
    -lcalcufunc -l是制定要用的动态库,库名砍头去尾(就是将lib和**.a**都取代奥)
    -L告诉gcc编译器从-L指定的路径(./ 表示从当前路径)去找静态库。默认是从/usr/lib 或者 /usr/local/lib去找

在这里插入图片描述
动态库的制作
1. gcc -shared -fpic mathfun.c -o libmathf.so
-shared 指定生成动态库
-fpic 标准,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so”。所以为“libmathf.so”
在这里插入图片描述
动态库的使用
gcc math.c -lmathf -L ./ -o mainProDt //这边的库名同样需要砍头去尾(去掉lib和**.so**)

在这里插入图片描述
这边执行失败的原因是找不到动态库

如何在指定运行的时候在当前路径下找动态库呢?
直接百度搜索liunx动态库宏 指定位置 就可以找到相关的文章,例如下面这篇文章
https://www.cnblogs.com/progamming/p/13043652.html
这篇文章的方法一不太建议使用
2.可以修改环境变量,可以指定该程序运行时候,在LD_LIBRARY_PATH 所指定的路径去找库文件
export LD_LIBRARY_PATH="/home/pi/test"——但这个环境变量是临时的只针对于当前窗口可以使用,换一个窗口就不行了
所以我们可以写一个脚本来解决这个问题
vi statrt.sh

export LD_LIBRARY_PATH="/home/pi/test

./mainProDt

在这里插入图片描述
然后 chmod +x start.sh ————+x表示可执行权限
运行该脚本就可以实现程序了,就算换个窗口执行该脚本仍然可以运行
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值