• 【Linux|树莓派】分文件编程以及静态库动态库


    一、分文件编程

      简单来说树莓派的分文件编程就是将一个项目的代码放在不同的文件里面,然后在主函数添加一个头文件,这样会使#控制字体颜色主程序变得简单
    在编译的时候要将主函数和功能函数一起编译:
    在这里插入图片描述
    注意:include include "calculatorfuncs.h" 的区别:
      前者表示引用标准库的头文件,编译时会从系统配置的库环境中去寻找,后者一般为用户自定义的头文件,比如分文件编程中自己定义的头文件,编译系统会从当前文件夹去寻找,如果找不到,则到系统的库文件中去寻找。

    Linux中C/C++默认库环境:/usr/include,可使用ls /usr/include 查看。
    在这里插入图片描述

    二、linux库

    使用GNU的工具我们如何在Linux下创建自己的程序函数库?
    一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级

    程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries):

    • 静态函数库是在程序执行前就加入到目标程序中去了 ;
    • 动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)

    Linux中命名系统中共享库的规则:
    在这里插入图片描述

    1、静态库优缺点

    静态库在程序执行(编译)前就加入到目标程序中去了。
    优点:
    1.静态库被打包到应用程序中加载速度快
    2.发布程序无需提供静态库,因为已经在app中,移植方便
    缺点:
    1.链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
    2.更新、部署、发布麻烦。
    在这里插入图片描述
    简单来说,优点: 运行快,发布程序无需提供静态库,因为已经在app中,移植方便;
    缺点:程序大,链接时完整的拷贝到执行文件中,会有多份冗余拷贝,更新部署麻烦。

    2、动态库优缺点

    动态函数库是在程序执行时动态(临时)由目标程序去调用。
    优点:
    1.链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。
    2.程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。
    缺点:
    1.加载速度比静态库慢
    2.发布程序需要提供依赖的动态库
    在这里插入图片描述
    简单来说,优点:程序小,链接时不用复制,程序运行时由系统动态加载到内存中,系统只加载一次,供多个程序共用,节省空间,程序升级简单,升级后只要库名字,函数名以及参数不变,只是做了优化就能加载成功。
    缺点:运行慢,加载速度比静态库慢,发布程序需要提供依赖的动态库。

    三、库的制作和使用

    1、静态库制作和使用

    静态库格式:libxxx.a
    制作:

    $gcc name.c -c
    $ar rcsv libname.a name.o
    a - name.o
    
    • 1
    • 2
    • 3

    编译:
    链接到刚刚生成的静态库libname.a

    $gcc test.c -lname -L./ -o mainStatic
    ./mainStatic
    
    • 1
    • 2

    -lname(-l后加libname.a掐头去尾)
    -L是告诉gcc编译器从-L制定的路径去找静态库(这里指定gcc编译器先从当前路径去找静态库),不用-L的话就会从默认的/usr/lib 或者/usr/local/lib路径去找静态库。
    在这里插入图片描述

    2、动态库制作和使用

    动态库格式:libxxx.so
    制作:

    $gcc -shared -fpic name.c -o libname.so
    
    • 1

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

    $gcc test.c -lname -L./ -o mainDynamic
    ./mainDynamic
    
    • 1
    • 2

    在这里插入图片描述
    注意:
    动态库这里直接./mainDynamic运行的话会出错,因为动态函数库是在程序执行时(临时)由目标程序去调用,所以这里会出错。

    • 方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径
      vi /etc/ld.so.conf添加 lib目录
      在这里插入图片描述
      修改后需要运行ldconfig命令。
    • 方法二:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(临时的使用
      export LD_LIBRARY_PATH="/home/pi/STUDY/library"
      在这里插入图片描述
      a.为了可以在多个窗口都可以使用动态库,可以写一个shell脚本来实现
      export LD_LIBRARY_PATH="/home/pi/STUDY/library"
      ./mainDynamic
      在这里插入图片描述
      b.给shell脚本添加可执行的权限
      chmod +x start.sh
      在这里插入图片描述
    • 方法三:直接将库文件复制到/lib或则/user/lib目录下
      sudo cp libcalculatorfuncs.so /user/lib
      在这里插入图片描述

    参考:
    1、Linux共享库、静态库、动态库详解
    2、Linux中的库

    最后谢谢阅读,笔者乃小白,如有错误之处还请指正。

  • 相关阅读:
    STM8S105k4t6c--------------点亮LED
    力扣--在排序数组中查找元素的第一个和最后一个位置
    Web前端大作业—电影网页介绍8页(html+css+javascript) 带登录注册表单
    【论文阅读】SimGNN:A Neural Network Approach to Fast Graph Similarity Computation
    8-flask django执行原生sql和sqlalchemy执行原生sql、flask-sqlalchemy使用(filter_by和filter)、flask-migrate使用
    Chapter8.4:非线性控制系统分析考研参考题
    jsp内的${}循环一次及循环几次相加出总和
    kafka搭建,演示
    linux 内核链表详解
    element+vue table上移+下移 拖拽
  • 原文地址:https://blog.csdn.net/qq_46249312/article/details/128167062