好处:
分模块的编程思想
(eg: 网络交给 a同事 来做
超声波交给 b同事来做
电机交给 c同事来做)
a.功能责任划分
b.方便调试
c.主程序简洁
静态函数库:是在程序执行之前(编译)就加入到目标程序当中去了
优点:运行快
缺点:大
动态函数库:是在程序执行时动态(临时)由目标程序去调用
缺点:运行慢
优点:小
a、gcc calcufuncs.c -c 生成xxxx.o文件
b、ar rcs libcalcufunc.a calcufuncs.o xxxx.o文件生成xxxx.a静态库文件
gcc -shared -fpic calcufuncs.c -o libcalc.so
-shared 指定生成动态库
-fpic 标准 fpic选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码
gcc calculatorT.c -lcalcufunc -L ./ -o mainProStasic
-lcalcufunc -l 是指定要用的动态库,库名砍头去尾
-L告诉gcc编译器从-L指定的路径去找静态库。默认是从
/usr/lib 或者 /usr/local/lib 去找
gcc calcuatorT.c -lcalc -L ./ -o mainProDy
libcalc.so
也是砍头去尾
带动态库的程序
可以指定该程序运行时候,在LD_LIBRARY_PATH 所指定的路径去找库文件
export LD_LIBRARY_PATH="/home/pi/back/tset"
先新建一个back 文件夹
新建一个叫calculatorT.c的文件
这是具体的代码
运行结果
分文件的思想是,能不能把加减乘除写在另一个文件里面
main是程序的主入口函数
main函数上面的函数则是功能性函数
1、串口
2、网络
3、线程
4、语音
5、加法 乘法 减法 除法
新建一个test的文件夹
然后把calculatorT.c 复制到当前目录下(也就是test下面)
改个名字
我要把它的main函数全部去掉,留下加减乘除,就可以啦
同样的主函数里面我们也把没有的去掉
留下main函数
那么我这两个文件怎样才能联合起来呢?
两个文件一起编辑,理论上会出错
那么如何才能去掉这些警告呢?
我们先运行起来,看看能不能运行
运行起来也可以(理论上应该报错)
起一个跟.c 文件一样名字的.h 文件
然后修改.h文件
把函数体给他去掉,留下函数的原型
记得后面写个分号,这叫函数的声明
然后要把头文件.h包含到主程序里面
那么为什么有的头文件用<>,有的用""号呢?
<>的意思是,默认的情况下,从usr/include里面找或者去usr/local/include里面去找头文件
里面有这么多头文件
假设我们想看stdio的
如果你写""号呢?
他会优先从当前路径来找
比如现在我们的代码在test的位置
会从当前位置找找看有没有头文件,有的话引用这个头文件,没有的话去默认的的usr/include里面找或者去usr/local/include里面去找头文件,找不到就报错
运行一下
没有任何警告生成了a.out
运行一下
这就是分文件,就是把一个文件拆分成两个而已
静态库制作:
主程序不是拿来打包的,我们打包的是功能程序
gcc calcufuncs.c -c 生成xxxx.o文件
如果我们遇见不认识的
比如不认识里面的ar
可以ar 或者ar --help
ar rcs libcalcufunc.a calcufuncs.o xxxx.o文件生成xxxx.a静态库文件
静态库的使用:
被谁用?当然是被主函数拿来用啦
你给别人的时候给.a和.h就可以啦
~是工作目录
*是通配符
(下面的意思:所有以calcufuncs开头的文件都给他移到工作目录中去,工作目录就是home/pi)
我们移出去多了,还得把.h移回来
你给别人提供的是.a 和.h 文件
用你的东西.a就够了,但是你必须把.h头文件给他,要不然它不知道你给的头文件有哪些函数
(最好写点注释,都是干啥的)
这样别人在用的时候就可以砍头去尾
显示有一个报错
因为-l有点像头文件,他会优先从usr/lib下面去找
那我们想要它从当前路径来找怎么办呢?
我们给他加一个-L,从指定路径,当面路径开始找,如果当前路径没有,再从usr/bin里面找,或者从usr/local/bin里面找
然后可以给他取个名字
./代表当前路径
把这个.c文件编译去链接这个静态库(calcufunc),在哪找这个静态库呢?./在当面路径下链接
运行
这样既做到了你写的功能给了别人,还做到了代码的保护,别人不知道你是怎么实现的
gcc calculatorT.c -lcalcufunc -L ./ -o mainProStasic
-lcalcufunc -l 是指定要用的动态库,库名砍头去尾( libcalcufunc.a里面的lib去掉,.a去掉)
-L告诉gcc编译器从-L指定的路径去找静态库。默认是从
/usr/lib 或者 /usr/local/lib 去找
假如你开发了一个程序,程序不想给别人源码,你只想给人家库
通常我们做开发只写一个.c 和.h 给人家
那我现在要把.c 变成动态库
gcc -shared -fpic calcufuncs.c -o libcalc.so
-shared 指定生成动态库
-fpic 标准 fpic选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码
把生成的动态库拷贝到test里面
(动态库和静态库的命名不一样
静态库libxxxxx.a
动态库libxxxxxx.so
so是动态库的意思,.a是静态库的意思
这个.so 跟window 的.dll有点像)
我们自己做的时候不关心版本号
编译主程序,也是找不到的
用-L指定从当前文件夹来找
他的使用和静态库一样
gcc calcuatorT.c -lcalc -L ./ -o mainProDy
libcalc.so
也是砍头去尾
执行不起来
为什么呢?因为静态库和动态库的区别
而我们动态库提示找不到动态库
为什么呢?
因为动态库是程序执行过程中由目标临时去调用(也就是说它运行的时候会去到处找这个库)
静态库不需要找,因为他已经编译到这个程序里面去了
有一种解决方法,把他copy到usr/lib里面去
他会默认去usr/lib里面去找
我们给他删掉再来运行
又有错误
那我们如何才能指定运行的时候到当前路径去找呢?
你直接敲export会把系统的环境变量列出来
然后 选择第二种方式
带动态库的程序
可以指定该程序运行时候,在LD_LIBRARY_PATH 所指定的路径去找库文件
export LD_LIBRARY_PATH="/home/pi/back/tset"
但是这个环境变量是临时的,只是针对这个窗口,换一个窗口呢?
也不行
所以我们可以写一个脚本
脚本里面的内容
然后给这个脚本一个可执行的权限
结果
换一个窗口执行start.sh 也是一样的
shell脚本,就是把多个指令并在一起
那我们再来计算一下文件的大小
du 是计算文件大小的意思
理论上动态库会更小
有时候端口号莫名的找不到了
你咋连也连接不上去
有时候安装失败,你可以先点击卸载再安装
这时候就能打开树莓派了