实习日记(5-9)动态链接库

8 篇文章 0 订阅

小记

笔记

今天先搞一下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位寄存器中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值