Linux静态库、共享动态库介绍、制作及使用

参考学习:Linux下的各种文件 、动态库基本原理和使用方法,-fPIC选项的来龙去脉 、Linux静态库和动态库分析

文章写作参考:Linux共享库、静态库、动态库详解 - sunsky303 - 博客园 (cnblogs.com)

一.Linux共享库、静态库、动态库详解

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

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

1、静态函数库,是在程序执行(编译)前就加入到目标程序中去了 。

  • 优点:
    1. 静态库被打包到应用程序中加载速度快;
    2. 发布程序无需提供静态库,因为已经在app中,移植方便。
  • 缺点:
    1. 连接是完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝;
    2. 更新、部署、发布麻烦。

2、动态函数库同共享函数库是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小(在Linux上叫共享对象库, 文件后缀是.so ,Windows上叫动态加载函数库, 文件后缀是.dll)。

  • 优点:
    1. 链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存;
    2. 程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。
  • 缺点:
    1. 加载速度比静态库慢;
    2. 发布程序需要提供依赖的动态库。

Linux中命名系统中共享库的规则

在这里插入图片描述

二.静态库的制作和使用

  1. 命名规则

    静态库文件名的命名方式是libxxx.a,库名前加lib后缀用.axxx为静态库名。

  2. 制作步骤

    原材料:源代码.c或者.cpp

    1. .c文件生成.ogcc a.c b.c -c
    2. 将.o 打包:ar rcs 静态库的名字 原材料 -> ar rcs libtest.a a.o b.o
  3. 静态库的使用

    gcc test.c -ltest -L ./ -o main

    • -l(小写的L):指定要用的静态库,库名要看头去尾(即要去掉lib和后缀.a)。
    • -L(大写的L):告诉gcc编译器从-L指定的路径去找静态库,如果没有指定,则默认从/usr/lib/usr/local/lib去找 ,这里有指定./-L ./的意思就是从当前路径去找。
    • -o(小写的O):指定生成的可执行文件。
    • 运行:直接像我们平时运行一样./main

三.动态库的制作和使用

  1. 命名规则

    动态库的命名方式与静态库类似,前缀相同,为lib,后缀变为.so。所以为libxxxx.so

  2. 制作步骤

    1. 将源文件生成.o,需要加一个参数fpicgcc a.c b.c -c -fpic(fPIC)

    2. 打包:gcc -shared a.o b.o -o libxxx.so

    3. 一般直接:gcc -fPIC -shared -o libxxx.so xxx.c

      创建符号链接:ln -s libxxx.so.1.0 libxxx.so.1

      • **注意:**这里的-fPIC中的PIC是大写,也有小写的-fpic(产生的代码相对较小,而且较快),在有些平台使用小写的-fpic选项有一些限制,而大写的-fPIC没有这个问题。绝大多数情况使用-fPIC

      • 关于PIC的理解:地址无关代码(Position Independent Code, PIC)

        模块间的函数调用、跳转和数据访问目的地址要等到装载时才能确定,ELF文件的做法是在数据段里面建一个指向这些模块间全局变量的指针数组,也被称为全局偏移表(Global Offset Table, GOT),当代码需要引用模块间全局变量时,可以通过GOT中的表项间接的引用。由于GOT是存放在数据段中,所以动态库在装载时可以被修改,每个进程都有独立的副本,相互之间不受影响。在编译时可以确定GOT相对于当前指令的偏移,编译器决定GOT内的每一项(4个字节为一项,一个指针)对应于哪一个全局变量名称,也就GOT给出了需要重定位的全局变量有哪些,以及该全局变量相对于GOT的位置。动态链接器在装载模块时会查找每个变量所在地址,然后填充GOT中的各个项,确保GOT中每个指针所指向的地址是正确的。

        参考:动态库基本原理和使用方法,-fPIC选项的来龙去脉

  3. 库的使用

    gcc main.c -L ./ -ltest -o mainPro

    如果直接运行./mainPro会提示No such file or directory,需要进行环境变量的设置。

    1. 使用环境变量

      • 临时设置:在终端进行:export LD_LIBRARY_PATH=动态库的路径:$LD_LIBRARY_PATH

      • 永久设置:

        用户级别:~/.bashrc,配置完成之后,重启终端或者source ~/.bashrc

        系统级别:/etc/profile,配置完成之后,重启计算机或者source /etc/profile

    2. 把库拷贝到/usr/local/lib目录下。

    3. 修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾,并执行ldconfig刷新。这样,加入的目录下的所有库文件都可见。

local/lib`目录下。

  1. 修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾,并执行ldconfig刷新。这样,加入的目录下的所有库文件都可见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/19293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ResNet 原理剖析以及代码复现

原理 ResNet 解决了什么问题? 一言以蔽之:解决了深度的神经网络难以训练的问题。 具体的说,理论上神经网络的深度越深,其训练效果应该越好,但实际上并非如此,层数越深会导致越差的结果并且容易产生梯度爆炸…

市场巨变,移动开发行业即将迎来“第二春”?

随着鸿蒙生态的不断壮大,越来越多的企业开始加入其中,对鸿蒙OS开发工程师的需求也越来越迫切。 年初时还只有200个APP宣布加入鸿蒙生态,而最近华为也已经官宣,已经有4000多个应用加入鸿蒙,短短三个月就增加了20倍。 …

【Python】解决Python报错:TypeError: ‘xxx‘ object does not support item assignment

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

Monaco-Editor在Vue中使用(实现代码编辑与diff代码比较)--类似vscode代码编辑器

Monaco-Editor 是一个由 Microsoft 开发的 Web 代码编辑器,它是 Visual Studio Code 的浏览器版本。在 Vue 项目中集成 Monaco-Editor 可以提供代码编辑、语法高亮、智能提示等功能 效果: 1、安装使用,最好安装指定版本,我是 vue…

六西格玛项目课题决策权归属:谁来做主更明智?

在实施六西格玛的过程中,一个关键的问题摆在了我们面前:应该由谁决定六西格玛的项目课题?这个问题不仅关系到项目能否顺利实施,更直接影响到企业整体绩效的提升。深圳天行健企业管理咨询公司解析如下: 首先&#xff0…

cocos creator 3.x 手搓背包拖拽装备

项目背景: 游戏背包 需要手动 拖拽游戏装备到 装备卡槽中,看了下网上资料很少。手搓了一个下午搞定,现在来记录下实现步骤; 功能拆分: 一个完整需求,我们一般会把它拆分成 几个小步骤分别造零件。等都造好了…

openresty(Nginx) 隐藏 软件包名称 版本号 升级新版本

1 访问错误或者异常的URL 2 修改配置,重新编译,升级 #修改版本等 vim ./bundle/nginx-1.13.6/src/core/nginx.h #define nginx_version 1013006 #define NGINX_VERSION "1.13.6" #define NGINX_VER "openresty/&q…

计算机网络学习笔记——应用层

一、应用层概述 二、客户/服务器方式(C/S方式)和对等方式(P2P方式) 客户/服务器(Client/Server,C/S)方式 服务器总是处于运行状态,并等待客户的服务请求。服务器具有固定端口号(例如HTTP服务器的默认端口号为80),而运行服务器的主机也具有固…

UVa11604 General Sultan

UVa11604 General Sultan 题目链接题意分析AC 代码 题目链接 UVA - 11604 General Sultan 题意 给出一些0和1组成的模式串,问是否存在一个串使得有多种方案将这个串分解成模式串。    给一个包含n(n≤100)个符号的二进制编码方式&#xff…

自学SPSS,有哪些教学视频或书籍推荐?

书籍推荐 经过长达八年的不断迭代与优化,SPSSAU的用户群体已经远超简单的数据分析层面,而是逐步深入到了学术研究的精髓之中。如今,无论是在SCI、EI等国际权威学术期刊,还是北大核心期刊、CSSCI等国内顶尖学术期刊上,…

leetCode.87. 扰乱字符串

leetCode.87. 扰乱字符串 题目思路(该方法以前可以过,现在对时间复杂度的要求严格了许多,不能过去): 这里显示,能够让我自己后期复习的时候,可以掌握最基本的做法(尽管不能通过全部样…

wangEditor富文本实现自定义插入数据(手把手)

插件版本如下: vue2版本 “@wangeditor/editor”: “^5.1.23”, “@wangeditor/editor-for-vue”: “^1.0.2”, 文件截图如下: 一、plugins/index.js 入口文件,整合模块导出外部使用 import withMention from ./plugin import renderElemConf from ./render-elem import …

重庆耶非凡科技选品师项目大揭秘:成功背后的故事与经验

在电商行业迅猛发展的今天,选品师这一职业愈发受到市场的关注。重庆耶非凡科技有限公司凭借其专业的选品团队和科学的选品方法,成为众多商家关注的焦点。那么,该公司的选品师项目是否真的有成功的案例呢?接下来,我们将从多个角度…

深度学习——卷积神经网络

卷积神经网络 1.导入需要的包2.数据导入与数据观察3.卷积层4.汇聚层最大汇聚 平均汇聚全局平均汇聚 5.搭建卷积神经网络进行手写数字识别导入并对数据进行预处理搭建卷积神经网络 6.利用函数式API与子类API搭建复杂神经网络残差层 1.导入需要的包 numpy as np: NumPy是一个用于…

Pytorch深度学习实践笔记4(b站刘二大人)

🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:pytorch深度学习 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质就是极致重复! 视频来自【b站刘二大人】 1 反向传播 Back propaga…

FFMPEG+ANativeWinodow渲染播放视频

前言 学习音视频开发,入门基本都得学FFMPEG,按照目前互联网上流传的学习路线,FFMPEGANativeWinodow渲染播放视频属于是第一关卡的Boss,简单但是关键。这几天写了个简单的demo,可以比较稳定进行渲染播放,便…

【运维】Linux 端口管理实用指南,扫描端口占用

在 Linux 系统中,你可以使用以下几种方法来查看当前被占用的端口,并检查 7860 到 7870 之间的端口: 推荐命令: sudo lsof -i :7860-7870方法一:使用 netstat 命令 sudo netstat -tuln | grep :78[6-7][0-9]这个命令…

全球痛风年轻化趋势明显 别嘌醇制剂需求增多

全球痛风年轻化趋势明显 别嘌醇制剂需求增多 别嘌醇制剂包括片剂和缓释胶囊两种剂型,别嘌醇片剂吸收快,可能会出现胃肠道反应;别嘌醇缓释胶囊释放比较缓慢,作用更持久,对胃肠道损害比较小。别嘌醇制剂是抑制尿酸合成的…

Java内存空间

Java内存空间划分 Java虚拟机在执行Java程序的过程中会把他管理的内存划分为若干个不同的数据区域,如图所示1.7和1.8两个版本的Java内存空间划分。 JDK1.7: JDK1.8: 线程私有: 程序计数器虚拟机栈本地方法栈 线程共享 : 堆方法区直接内…

股价飙升:AI PC大变革,联想的“联想时刻”正在缔造?

按照产业的传导逻辑,在颠覆式技术到来之时,当引发这场变革的最核心技术及产品真正进入了产品化、商业化阶段,此时直触需求端的终端厂商,其成长性估算将得到市场的重新预估。 眼下AI PC之于联想就是如此。 5月27日,联…