Linux库概念及相关编程
分文件编程案例
好处:分模块的编程思想
网络 a
超声波b
电机c
a.功能责任划分
b.方便调试
c.主程序简洁
fxadd.c
/*
功能性的函数
1、串口
2、网络
3、线程
4、语音
5、加减乘除法
*/
#include <stdio.h>
#include <stdlib.h>
#include "funcsadd.h"
int main()
{
int data1;
int data2;
int ret;
while(1)
{
printf("please input your need first number::::\n");
scanf("%d",&data1);
printf("please input your need second number::::\n");
scanf("%d",&data2);
ret=add(data1,data2);
printf("it is %d+%d=%d\n",data1,data2,ret);
}
return 0;
}
funcsadd.c
int add(int x,int y)
{
int z;
z=x+y;
return z;
}
funcsadd.h
int add(int x,int y);
为什么 要把 funcsadd.h放进fxadd.c 实际上是自己写的库 就好比 include也是 库 在 Linux里的命令是
这样去查看 include<>里的库函数 “”则是自己弄的
库的概念
https://www.cnblogs.com/sunsky303/p/7731911.html
https://blog.csdn.net/wk_bjut_edu_cn/article/details/81735956
使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。
程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries):
1、静态函数库,是在程序执行前就加入到目标程序中去了 ;
2、动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)
Linux中命名系统中共享库的规则
1.静态库
静态函数库,是在程序执行前(编译)就加入到目标程序中去了 ;
优点: 运行快
发布程序无需提供静态库,因为已经在app中,移植方便
缺点:大
2.动态库
动态函数库,是在程序执行时动态(临时)由目标程序去调用
缺点: 运行慢
优点: 小
库的生成和使用
静态库 xxxx.a
制作步骤:
第一步:
将源文件生成.o,需要加一个参数fpic
gcc a.c b.c -c -fpic(fPIC)
gcc funcsadd.c 生成xxxx.o文件
第二步:
将.o打包,
ar rcs 静态库名字 原材料
arc rcs libtest.a a.o
ar rcs libaddfunc.a funcsadd.o 把xxxx.o文件生成xxxx.a静态库文件
mv funcsadd.* ~ 是将funcsadd.c funcsadd.o funcsadd.h移到工作目录/home/
cp ~/funcsadd.h . 是讲/home/目录下的文件复制到当前我光标所在的目标文件里
报错 为什么 因为 -l是像头文件会优先去 ls /usr/lib/去找
我们要让它在 当前路径去找 gcc fxadd.c -laddfunc -L ./
(-laddfunc -l是制定要用的动态库,库名砍头去尾
-L告诉gcc编译器从-L制定的路径去找静态库。默认是从/usr/lib /usr/local/lib去找)
静态库的使用:gcc fxadd.c -laddfunc -L ./ -o mainProStatic
动态库 xxxx.so
动态库的生成:
gcc -shared -fpic funcsadd.c -o libadd.so
-shared 指定生成动态库
-fpic 标准,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
动态库的使用:
gcc fxadd.c -ladd -L ./ -o mainProDy
编译起动态库 编译不起来 为什么??找不到这个动态库??
动态库是运行的时候一直去找那个 libadd.so 可是一直找不到
办法是:sudo cp libadd.so /usr/lib/
它是默认在 /usr/lib/去找 那如何在当前路径去找呢?
引用动态库,怎么指定动态库的位置
https://www.cnblogs.com/progamming/p/13043652.html
带动态库的程序,
可以指定该程序运行时候,在LD_LIBRARY_PATH 所指定的路径去找库文件
export LD_LIBRARY_PATH="/home/pi/back/test"
去vi start.sh 里面加入上面这个export LD_LIBRARY_PATH="/home/pi/back/test“
"这只是个脚本文件
sudo是超级用户权限
du 计算文件大小