树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况

一、分文件编程案例

好处:

        分模块的编程思想        

       (eg: 网络交给             a同事 来做

                超声波交给         b同事来做

                电机交给              c同事来做)

         a.功能责任划分

         b.方便调试

        c.主程序简洁

二、库

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第1张图片

a、静态库

静态函数库:是在程序执行之前(编译)就加入到目标程序当中去了

优点:运行快

缺点:大

b、动态库

动态函数库:是在程序执行时动态(临时)由目标程序去调用

缺点:运行慢

优点:小

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第2张图片

  三、库的制作

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

a、gcc calcufuncs.c -c                                            生成xxxx.o文件

b、ar rcs libcalcufunc.a calcufuncs.o                          xxxx.o文件生成xxxx.a静态库文件

 树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第3张图片

动态库的制作:

 gcc -shared -fpic calcufuncs.c -o libcalc.so

-shared  指定生成动态库

-fpic    标准        fpic选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第4张图片

四、库的使用

静态库:

                gcc calculatorT.c -lcalcufunc -L ./ -o mainProStasic

                  -lcalcufunc    -l 是指定要用的动态库,库名砍头去尾

                                        -L告诉gcc编译器从-L指定的路径去找静态库。默认是从

                                                /usr/lib    或者   /usr/local/lib 去找

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第5张图片

    动态库:     

        gcc calcuatorT.c -lcalc -L ./ -o mainProDy                 

                                    libcalc.so

                                        也是砍头去尾   

带动态库的程序

可以指定该程序运行时候,在LD_LIBRARY_PATH 所指定的路径去找库文件

export LD_LIBRARY_PATH="/home/pi/back/tset"

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第6张图片

相关代码的实现:

一、分文件编程案例相关代码

先新建一个back 文件夹

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第7张图片

 

 新建一个叫calculatorT.c的文件

这是具体的代码

 树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第8张图片

 树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第9张图片

 运行结果

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第10张图片

分文件的思想是,能不能把加减乘除写在另一个文件里面

main是程序的主入口函数

main函数上面的函数则是功能性函数

                1、串口

                2、网络

                3、线程

                4、语音

                5、加法 乘法 减法 除法

新建一个test的文件夹

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第11张图片

然后把calculatorT.c  复制到当前目录下(也就是test下面)

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第12张图片

改个名字

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第13张图片

 我要把它的main函数全部去掉,留下加减乘除,就可以啦

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第14张图片

同样的主函数里面我们也把没有的去掉

 留下main函数

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第15张图片

 那么我这两个文件怎样才能联合起来呢?

两个文件一起编辑,理论上会出错

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第16张图片

 那么如何才能去掉这些警告呢?

我们先运行起来,看看能不能运行

运行起来也可以(理论上应该报错)

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第17张图片

理论上我们还需要一个函数的声明

起一个跟.c 文件一样名字的.h 文件

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第18张图片

然后修改.h文件

把函数体给他去掉,留下函数的原型

记得后面写个分号,这叫函数的声明

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第19张图片

然后要把头文件.h包含到主程序里面

  那么为什么有的头文件用<>,有的用""号呢?

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第20张图片

<>的意思是,默认的情况下,从usr/include里面找或者去usr/local/include里面去找头文件

 里面有这么多头文件

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第21张图片

假设我们想看stdio的

如果你写""号呢?

他会优先从当前路径来找

比如现在我们的代码在test的位置

会从当前位置找找看有没有头文件,有的话引用这个头文件,没有的话去默认的的usr/include里面找或者去usr/local/include里面去找头文件,找不到就报错

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第22张图片

 运行一下

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第23张图片

没有任何警告生成了a.out

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第24张图片

 运行一下

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第25张图片

 这就是分文件,就是把一个文件拆分成两个而已

二、静态库的制作和使用相关代码

静态库制作:

主程序不是拿来打包的,我们打包的是功能程序

gcc calcufuncs.c -c                                            生成xxxx.o文件

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第26张图片

 如果我们遇见不认识的

比如不认识里面的ar

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第27张图片

可以ar 或者ar --help

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第28张图片

 ar rcs libcalcufunc.a calcufuncs.o                          xxxx.o文件生成xxxx.a静态库文件

静态库的使用:

被谁用?当然是被主函数拿来用啦

你给别人的时候给.a和.h就可以啦

~是工作目录

*是通配符

(下面的意思:所有以calcufuncs开头的文件都给他移到工作目录中去,工作目录就是home/pi)

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第29张图片

 我们移出去多了,还得把.h移回来

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第30张图片

你给别人提供的是.a 和.h 文件

用你的东西.a就够了,但是你必须把.h头文件给他,要不然它不知道你给的头文件有哪些函数

 (最好写点注释,都是干啥的)

        

这样别人在用的时候就可以砍头去尾

显示有一个报错

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第31张图片

因为-l有点像头文件,他会优先从usr/lib下面去找

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第32张图片

那我们想要它从当前路径来找怎么办呢?

我们给他加一个-L,从指定路径,当面路径开始找,如果当前路径没有,再从usr/bin里面找,或者从usr/local/bin里面找

 然后可以给他取个名字

./代表当前路径

把这个.c文件编译去链接这个静态库(calcufunc),在哪找这个静态库呢?./在当面路径下链接

运行

这样既做到了你写的功能给了别人,还做到了代码的保护,别人不知道你是怎么实现的

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第33张图片

    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选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码

 树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第34张图片

把生成的动态库拷贝到test里面

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第35张图片

(动态库和静态库的命名不一样

静态库libxxxxx.a

动态库libxxxxxx.so

so是动态库的意思,.a是静态库的意思

这个.so 跟window 的.dll有点像)

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第36张图片

 我们自己做的时候不关心版本号

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第37张图片

 编译主程序,也是找不到的

用-L指定从当前文件夹来找

 他的使用和静态库一样

        gcc calcuatorT.c -lcalc -L ./ -o mainProDy                 

                                    libcalc.so

                                        也是砍头去尾   

执行不起来

 为什么呢?因为静态库和动态库的区别

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第38张图片 树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第39张图片

 树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第40张图片

 而我们动态库提示找不到动态库

 为什么呢? 

因为动态库是程序执行过程中由目标临时去调用(也就是说它运行的时候会去到处找这个库)

静态库不需要找,因为他已经编译到这个程序里面去了

有一种解决方法,把他copy到usr/lib里面去

他会默认去usr/lib里面去找

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第41张图片

 我们给他删掉再来运行

又有错误

 那我们如何才能指定运行的时候到当前路径去找呢?

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第42张图片

你直接敲export会把系统的环境变量列出来

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第43张图片

 然后 选择第二种方式

带动态库的程序

可以指定该程序运行时候,在LD_LIBRARY_PATH 所指定的路径去找库文件

export LD_LIBRARY_PATH="/home/pi/back/tset"

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第44张图片

 但是这个环境变量是临时的,只是针对这个窗口,换一个窗口呢?

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第45张图片

 也不行

所以我们可以写一个脚本

 脚本里面的内容

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第46张图片

 

然后给这个脚本一个可执行的权限

 结果

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第47张图片

换一个窗口执行start.sh 也是一样的

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第48张图片

 shell脚本,就是把多个指令并在一起

那我们再来计算一下文件的大小

du 是计算文件大小的意思

理论上动态库会更小

        补充:

有时候端口号莫名的找不到了

你咋连也连接不上去

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第49张图片

需要下载解压这个文件 

打开这个文件 树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第50张图片

有时候安装失败,你可以先点击卸载再安装

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第51张图片 

 这时候就能打开树莓派了

树莓派:linux库概念及相关编程(面试重点):以及USB端口号找到不的情况_第52张图片

 用户名pi

密码raspberry

你可能感兴趣的:(树莓派,linux,面试,其他)