小记
笔记
今天先搞一下cJSON库,了解一下C库的引入
这里有一篇讲静态链接库和动态链接库的博客:
https://www.xuebuyuan.com/3235833.html
我这里阅读后整理一下:
-
什么是库?
库,是一种封装机制,简单说是把所有的源代码编译成目标代码后打成的包.库的开发者除了提供库的目标代码外,还提供一系列的头文件,头文件中就包含了库的接口,另外还有一些必要的注释.库函数根据是否被编译到程序内部而分为静态链接库(static)和动态链接库(dynamic).
简而言之,库是函数的集合,或.o文件的集合.链接器(LD)用于将用户自己的.o文件与库函数链接在一起. -
什么是.o文件?
这是linux平台的,o是链接抄文件,而a是库文件:
a库文件可以通过ar命令从o文件得到知:ar rcs libfoo.a a.o b.o
一般a文件都放在/usr/lib目录下,我们把libfoo.a也放在此目录,以后要使用libfoo.a中的函数,比如
hello.c中引用道了libfoo.a中的函数,编译如下:
gcc hello.c -Lfoo -o hello -
静态链接库
静态链接库相当于是复制粘贴了目标代码
扩展名 : 这类函数通常扩展名类似于libxxx.a -->“lib”、"a"必须都加上,中间的"xxx"表示库的名称 -
动态链接库
扩展名 : 这类函数通常扩展名类似于libxxx.so
动态链接库相当于添加了指向语句,指向了函数库文件,函数库文件中的源码跟自己的代码段没有直接的关系 -
动态静态优缺
静态不方便维护,若要修改链接库中的内容则需要将源码整个再重新编译一下,占空间相比动态会大。动态速度相比静态会慢一些,但是编译时还是优先选用动态。
由于Linux系统里的套件依赖性太复杂,如果使用太多的静态函数库,势必会给系统升级带来很大的麻烦.因此在Linux中,多采用动态函数库,
最主要的原因就是函数库升级方便.
绝大多数的函数库都放在:
/lib
/usr/lib
/lib/modules (Linux核心的函数库) -
创建动态函数库
[root@loalhost lishuai]#gcc test1.c test2.c test3.c -shared -o libtest.so //这是主要的
[root@loalhost lishuai]#ls //ls是显示文件,类似dir
[root@loalhost lishuai]#test1.c test2.c test3.c test.h libtest.so
注释:
<1> -shared : 创建动态函数库
libtest.so : 这是动态函数库名所规定的书写格式.以"lib"开头,以"so"结尾,中间是动态函数库名.
<2> 制作动态函数库时,不需要加上头文件,即:
不能写成:gcc test1.c test2.c test3.c test.h -shared -o libtest.so
<3> 制作动态链接库时,gcc不需要参数-L、-l、-I,这些参数只是在链接函数库时才使用,而不是在制作函数库时使用
- 动态链接库编译
动态库函数编译牵扯到文件路径问题,分为四种情况
1、动态库函数和头文件都在当前路径下
2、动态函数库和头文件均在系统路径下
3、动态函数库在系统路径下,头文件在当前路径下
4、动态函数库在当前路径下,头文件在系统路径下
具体方法还是需要翻看上面的博客,也就是:
https://www.xuebuyuan.com/3235833.html
gcc test1.c -shared -o libtest.so
执行完后生成了一个libtest.so
编译:
gcc test.c -L./ -ltest -o test
生成了一个test可执行文件:
执行报错:
cannot open shared object file: No such file or directory
查了一些博客:
大致是有关文件路径的缘故
注释:gcc的编译选项
-I 首个查找:目录作为第一个寻找头文件的目录
-L 路径 :指定额外的库函数搜索路径DIR,因此-L./表示指定函数库的路径为当前路径
-l 函数库名 :指定链接时需要的其它函数库,这里特别注意的是l后跟函数库的名字,即test,而不是libtest.so
按照这个博客做的落地成功:
https://www.cnblogs.com/nufangrensheng/p/3427529.html
还有这篇:
https://blog.csdn.net/chen495810242/article/details/89314570
我在usr\local\lzl\usr\local下新建了一个bin文件夹,且执行了下面的命令:
export LD_LIBRARY_PATH=/usr/local/lzl/usr/local/lib:$LD_LIBRARY_PATH
解析:
如果共享库文件安装到了其它"非/lib或/usr/lib" 目录下, 但是又不想在/etc/ld.so.conf中加路径(或者是没有权限加路径). 那可以export一个全局变量LD_LIBRARY_PATH, 然后运行程序的时候就会去这个目录中找共享库.
LD_LIBRARY_PATH的意思是告诉loader在哪些目录中可以找到共享库. 可以设置多个搜索目录, 这些目录之间用冒号分隔开. 比如安装了一个mysql到/usr/local/mysql目录下, 其中有一大堆库文件在/usr/local/mysql/lib下面, 则可以在.bashrc或.bash_profile或shell里加入以下语句即可:
export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH
照最开始的博客讲的在使用了 -L./ 后应该是不需要再进行这些操作了啊,还是不行,只能这样成功,虽然博客中说这个是临时方案,我先这样用吧,后期再问问大佬。
这样的话动态链接库算是跑起来一个小Demo,下面整合一下cJSON链接库
我直接在usr/lib下生成了libcjson.so文件,编译成功
我又将usr/lib下的libcjson.so删除,在与运行文件同一级的新建了一个libcjson.so,编译成功
使用的是
gcc hello.c -L./ -lcjson -o hello
modbus协议
一篇特别棒的博客:建议反复阅读
https://www.cnblogs.com/txwtech/p/11104428.html
寄存器
- 啥是寄存器?
https://blog.csdn.net/qq_37340753/article/details/80935423
寄存器进行信息存储;寄存器是CPU中与程序员可以用指令读写的部件,不同的CPU,寄存器的个数、结构是不相同的。
这里有一篇内存和寄存器横向比较的博客:
http://www.ruanyifeng.com/blog/2013/10/register.html
寄存器是CPU的组成部分,因为在CPU内,所以CPU对其读写速度是最快的,不需要IO传输,
但同时也决定了此类寄存器数量非常有限,有限到几乎每个存储都有自己的名字,而且有些还有多个名字。
- 字节byte
字节(byte):一个字节有8个bit组成,可以存在8位寄存器中。