一、分文件编程案例

好处:

        分模块的编程思想        

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

超声波交给         b同事来做

电机交给              c同事来做)

         a.功能责任划分

         b.方便调试

        c.主程序简洁

二、库

a、静态库

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

优点:运行快

缺点:大

b、动态库

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

缺点:运行慢

优点:小

  三、库的制作

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

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 是计算文件大小的意思

理论上动态库会更小

        补充:

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

你咋连也连接不上去

需要下载解压这个文件 

打开这个文件 

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

 

 这时候就能打开树莓派了

 用户名pi

密码raspberry

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

  1. Linux库概念及相关编程(面试重点)

    Linux库概念及相关编程(面试重点) 一.分文件编程案列 好处: 分模块的编程思想 网络 超声波 电机 功能责任划分 方便调试 主程序简洁 二.库文件 库是一组预先编译好的函数的集合,这些函数都是按 ...

  2. Linux库概念及相关编程

    Linux库概念及相关编程(面试重点) 1.分文件编程案例 好处: 分模块的编程思想 网络 a 超声波b 电机c a.功能责任划分 b.方便调试 c.主程序简洁 2.库 Linux共享库.静态库.动态 ...

  3. Linux库概念及相关编程(动态库、静态库、环境变量)

    分文件编程: 好处:分模块编程思想,功能和责任划分清楚便与调试,main函数简洁,代码易于阅读. 编程时头文件有的是使用<>这个符号括起来的,有的是" "使用的是双引号 ...

  4. Linux基础—” Linux静态动态库及相关编程“ 面试必问的知识点你了解了嘛

    文章目录 Linux库引入之分文件编程 分文件编程案例 Linux库 1. 库是什么 2. 静态函数库 3. 动态库 Linux库概念及相关编程(面试重点) Linux库引入之分文件编程 分文件编程案 ...

  5. 把Linux下外设的USB端口号映射到固定的名字

    目录 1. 固定USB设备的端口号的原理 2..rules文件的编写方法 3.映射结果查看 1. 固定USB设备的端口号的原理 近期调试了一款云台,控制方面需要用到串口通信,调试过程中发现了一个问题, ...

  6. 关于树莓派USB端口号查询说明

    关于树莓派USB端口号查询说明 表示方式 树莓派USB端口说明 查询方式 表示方式 树莓派USB端口号的表示方式与电脑端并不同(后会附上查询方式及指令),电脑端通常为如 'COM1'和'COM2'的形 ...

  7. 【Java 18】网络编程 - 概述、网络编程要素、IP和端口号、网络协议、TCP、UDP、URL

    网络编程 - 概述.网络编程要素.IP和端口号.网络协议.TCP.UDP.URL 网络编程 1 网络编程概述 2 网络通信要素概述 3 通信要素1:IP和端口号 3.1 内容 3.2 InetAddr ...

  8. Linux库概念及分文件编程(面试重点)

    1.分文件编程案例 分文件前的源代码: #include <stdio.h> /** 功能性的函数* 1.串口* 2.网络* 3.线程* 4.语音* 5.加法.乘法.减法.除法* */ i ...

  9. Linux库的分文件编程

    今天是除夕,贴了一上午的对联,吃完午饭就稍微学习一下,晚上就是Happy之夜了 除夕过后,你将涅槃重生,逆风翻盘,这一局,是必胜局! 屁话太多,进入正题: 分文件编程好处: 可以将不同的功能模块交给不 ...

最新文章

  1. Vue里标签嵌套限制问题解决------解析DOM模板时注意事项:
  2. linux下安装oracle客户端,实现远程连接oracle库,导出数据表
  3. 分酒问题matlab代码,matlab葡萄酒分类数据归一化问题
  4. foreman源NO_PUBKEY 6F8600B9563278F6
  5. xms和xmx为什么要相同_股民为什么要做股票配资?
  6. PX4 CMakeLists.txt 文件剖析
  7. 管理感悟:如何看待培训
  8. amoeba mysql proxy_mysql-proxy和amoeba 分别实现Mariadb读写分离
  9. Android图片太大导致无法正常显示
  10. 北京大学肖臻老师《区块链技术与应用》公开课笔记8——BTC挖矿篇
  11. 只需三步!使用3DCG软件Blender制作时尚图片
  12. ヴィアッカ / 风锤
  13. ASP.NET Core 技术内幕与项目实战读后感
  14. 大二妹子问锋哥,学Java还是学C,考研还是就业?
  15. 基于echarts+js+fexible.js实现的数据可视化适配案例(附源代码)
  16. iPhone 录音如何去除背景杂音增强录音品质
  17. 好好说话之ret2shellcode
  18. 23个经过时间考验的应用程序,可以管理您的远程软件开发团队
  19. 【20保研】暨南大学关于举办2019年优秀大学生暑期学术夏令营活动的公告
  20. MASM32 v11 汇编、连接及运行程序的方法

热门文章

  1. 【PC工具】Windows下用RaiDrive挂载各种网盘为本地硬盘,挂载Google Drive网盘为本地硬盘使用...
  2. kdir测试软件,[OK210开发板体验]入门篇(4)编程入门(NFS登录、驱动入门)
  3. 详解在Linux下实现(彩色)进度条程序,并通过makefile进行编译.
  4. shell编程基本语法
  5. PAT乙级-1056. 组合数的和(15)
  6. 虚拟化方面包含了主机、存储和网络
  7. 发布ASP.NET Core程序到Linux生产环境
  8. iOS app 切图
  9. Excel函数应用教程:数据库函数
  10. Linux环境变量配置