库到底是个啥?为啥要链接,链接库的本质又是个啥?

news2024/11/18 19:39:00

目录

前言

一、库是个啥?

①最开始的库是用来解决啥问题?

②库的基本构成

③动态库与静态库

二、如何生成库

0、相关知识

①生成静态库

         ②生成动态库

三、库的使用

         ①修改环境变量

②拷贝.so文件到系统共享库路径下, 一般指/usr/lib

③ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新(配置文件)



 

前言

 当你勤勤恳恳完成需求后,要交付你的成果时,你突然发现了一个问题,如果直接把源代码给乙方,他就可以直接进入你的代码,然后狠狠的学习再“借鉴”,甚至修改,你的头发的产物就被别人盗取了。这该如何是好?


一、库是个啥?

①最开始的库是用来解决啥问题?

由程序员第一准则:绝不造重复的轮子。我们可以推出了在编程中,一旦一个东西被广泛的应用,甚至成为标配时,就意味着这个东西一定有种不可替代或者使用面广的的功能。

就如“前言”中所说,在用户端的代码如果不隐藏和高程度的封装,都是不行的,对于编写者不能保护其知识产权,对于用户也不能方便的使用。

而“库”这一概念就被引了出来,库的编写者们将各种各样的需求转化为各种函数或对象,在把它们如何使用的接口放入一个.h头文件中,再把这些接口的实现封装在一起,在打包或者加密隐藏其实现的源代码,而这个就是库的基本模型了。

②库的基本构成

在①的最后,我们知道了库的基本实现原理,那如果我们想手动搞一个简单的库呢?

 想本质的了解库,我们先来看看编译是如何的。

对于编译的过程想必大家都了然于心,分别是 预处理、编译、汇编、链接,这四部曲每一步都会生产对应的文件。

各步骤对应的gcc 命令(我们平时使用-o命令,是直接将所有步骤合在一起了)

不同步骤时产生的对应文件后缀

从上图我们可以知道,预处理、编译、汇编、链接生成的文件后缀分别是,.i、.s、.o和最后的可执行文件.exe,而库的打包就是在Linking(链接)这一步完成的。

简而言之,库 = .o文件的集合(接口的实现)+ .h接口文件(告诉用户我有那些接口)

③动态库与静态库

在了解库的本质后,后续我们根据库的使用方法和形成方式分为了2种库:动态库(.so)与静态库(.a)

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。
动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。


特别的:

  • 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
  • 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
  • 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

二、如何生成库

为了方便演示以下用Linux命令行的形式做演示。

0、相关知识

库搜索路径

  • 从左到右搜索-L指定的目录。
  • 由环境变量指定的目录 (LIBRARY_PATH)
  • 由系统指定的目录(计算机上的默认库的存放)
    • /usr/lib
    • /usr/local/lib

①生成静态库
 

[root@localhost linux]# ls
add.c add.h main.c sub.c sub.h
[root@localhost linux]# gcc -c add.c -o add.o
[root@localhost linux]# gcc -c sub.c -o sub.o
生成静态库
[root@localhost linux]# ar -rc libmymath.a add.o sub.o
ar是gnu归档工具,rc表示(replace and create)
查看静态库中的目录列表
[root@localhost linux]# ar -tv libmymath.a
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 add.o
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 sub.o
t:列出静态库中的文件
v:verbose 详细信息
[root@localhost linux]# gcc main.c -L. -lmymath
-L 指定库路径
-l 指定库名
测试目标文件生成后,静态库删掉,程序照样可以运行。

其中libmymath.a即是我们依赖add.o和sub.o形成的静态库了。

②生成动态库

动态库不同于静态库,该库在使用时还需要OS去参与外部的链接,来实现共享,所以我们除了把相关的.o文件打包以外,还需要给其加一个共享的格式,又因为动态库的内部查找是偏移量的方式,所以还要加一个与位置无关码。

  • shared: 表示生成共享库格式
  • fPIC:产生位置无关码(position independent code)
  • 库名规则:libxxx.so(生成动态库命令时,必须要前面的lib和后面的.so)
[root@localhost linux]# gcc -fPIC -c sub.c add.c [root@localhost linux]# gcc -shared -o libmymath.so*.o 
[root@localhost linux]# ls add.c add.h add.o libmymath.so main.c sub.c sub.h sub.o

三、库的使用

由于静态库是直接在编译链接的时候把库的代码链接到可执行文件中。所以直接拷贝库到系统共享库路径下即可(一般指/usr/lib),程序运行的时候将不再需要静态库,即可直接使用。

但是静态库由于编译链接时不把库的代码链接到可执行文件中,而是在运行时,由操作系统从磁盘上的该动态库中复制到内存中(动态链接),所以除了我们在生成动态库告诉可执行文件库的存在,还需要告诉操作系统库的存在与路径

而告诉操作系统主要分为3个方式

①修改环境变量

在环境变量中,有着与外部库的路径这一变量(LD_LIBRARY_PATH)。

[root@localhost linux]# export LD_LIBRARY_PATH=.

不过默认的为了环境变量的纯净,每一次启动环境变量都会重写,这就导致了我们的第三方库每一次启动机器后都要改(当然也可以修改环境变量的配置去实现永久修改,不过就跟麻烦了)。

②拷贝.so文件到系统共享库路径下, 一般指/usr/lib

和静态库的使用一样,也是拷贝到这个路径下。

③ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新(配置文件)


直接写入库的对应路径即可

[root@localhost linux]# cat /etc/ld.so.conf.d/bit.conf
/root/tools/linux
[root@localhost linux]# ldconfig

特别的:这些库是用来支持项目的相关接口,所以库的配置其实也就是我们熟悉的“安装”的一个重要部分,将相应的库拷贝到系统的相应目录。

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

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

相关文章

安卓逆向_6 --- JNI 和 NDK

Java 本机接口规范内容:https://docs.oracle.com/en/java/javase/19/docs/specs/jni/index.html JNI官方中文资料:https://blog.csdn.net/yishifu/article/details/52180448 NDK 官方文档:https://developer.android.google.cn/training/ar…

【Python学习笔记】第二十八节 Python random 模块

一、Python random简介Python random 模块主要用于生成随机数。大部分python人都会用,但是一般人都是使用randint()帮我们生成某个范围的整数,但其实random模块还有很多非常使用的功能供我们使用,接下来我们就一一了解一下我们的random。要使…

JavaWeb系列之tomcat 服务器安装

文章目录一、JavaWeb应用程序架构B/S 架构C/S 架构B/S 与 C/S 对比MVC设计模式二、MVCMVC 开发项目搭建Web 服务器tomcat 服务器Idea 集成 tomcat第一个 JavaWeb 项目三、JSP 技术jsp 与 servlet 联系与区别一、JavaWeb 简介 JavaWeb 可以理解成使用 java 进行应用程序开发&am…

Windows-jdk8/jdk16安装

Windows-JAVA jdk-8安装教程 下载地址 百度网盘 提取码:Chen 官网 安装jdk8 双击打开下载的安装包 点击下一步 更改安装目录 点击下一步 修改Java安装目录 点击下一步 完成 配置环境变量 按住WindowsR 打开运行窗口 输入 sysdm.cpl 打开系统属性——》高级—…

华为机试题:HJ102 字符统计(python)

文章目录(1)题目描述(2)Python3实现(3)知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

【Redis】Redis分片集群

【Redis】Redis分片集群 文章目录【Redis】Redis分片集群1. 搭建分片集群1.1 分片集群结构1.2 搭建分片集群1.2.1 集群结构1.2.2 准备实例和配置1.2.3 启动1.2.4 创建集群1.2.5 测试2. 散列插槽2.1 总结3. 集群伸缩4. 故障转移4.1 数据迁移5. RedisTemplate访问分片集群1. 搭建…

GEE开发之ERA5(气温、降水、压力、风速等)数据获取和分析

GEE开发之ERA5(气温、降水、压力、风速等)数据获取和分析1.ERA5介绍2.初始ERA5数据2.1 DAILY代码2.2 MONTHLY代码3.遥感影像查看(DAILY之mean_2m_air_temperature)4.逐日数据分析和获取(以mean_2m_air_temperature为例)5.逐月数据…

【Storm】【二】Storm和流处理简介

Storm和流处理简介 一、Storm1.1 简介1.2 Storm 与 Hadoop对比1.3 Storm 与 Spark Streaming对比1.4 Storm 与 Flink对比二、流处理2.1 静态数据处理2.2 流处理一、Storm 1.1 简介 Storm 是一个开源的分布式实时计算框架,可以以简单、可靠的方式进行大数据流的处理…

基于 explore_lite包 的单个机器人自主探索建图

文章目录一、简介二、安装 explore_lite三、launch 文件配置四、实验效果五、常见问题机器人自主建图有很多方式,比如基于位置边界的map-explore,基于快速搜索树的rrt-explore,指定区域自主探索建图frontier-explore,这几种方法各…

SQL速查

学习自C语言中文网SQL教程笔记,该笔记为速查笔记,学习还是看原教程文章:http://c.biancheng.net/sql/ SQL命令 SQL 是关系型数据库的标准语言,SQL关键字不区分大小写 SQL语句分为以下三种类型: DML: Data Manipulat…

中国不缺高端产品,缺的只是高端服务

作者 | 曾响铃 文 | 响铃说 最近,响铃受邀参加了讯飞智能办公本莫比俱乐部在广州举办的用户研学活动,感触颇多。 为什么会有这趟经历?说来也巧,前段时间因为开会需要入手了讯飞智能办公本X2,成了他们的用户&#xf…

20- tensorflow实现 10_monkeys分类 (tensorflow系列) (项目二十)

项目要点 10-monkey-species,是十个种类的猴子的图像集。txt 文件读取: labels pd.read_csv( ./monkey_labels.txt , header 0)训练数据 图片数据增强: # 图片数据生成器 # 图片数据生成器 train_datagen keras.preprocessing.image.ImageDataGenerator(rescal…

docker升级后启动失败 需要指定storage driver

问题描述:闲来无事就在开发电脑上执行了下sudo apt-get upgrade 升级下软件, 升级后docker启动失败.使用 journalctl -xeu docker.service 查看docker执行日志:Mar 04 16:48:10 pop-os dockerd[39273]: time"2023-03-04T16:48:10.35187991208:00&qu…

[Java代码审计]—OFCMS

环境搭建 下载地址:https://gitee.com/oufu/ofcms/repository/archive/V1.1.2?formatzip 项目导入idea,创建数据库,配置下tomcat就行,但要注意必须tomcat>8.5,mysql>5.7 漏洞分析 任意文件写入 com.ofsoft…

打包可执行文件

将Python脚本打包成可执行文件的方法:使用pip安装PyInstaller:pip install pyinstaller打开终端并导航到包含Python脚本的目录。运行PyInstaller创建可执行文件:pyinstaller --onefile phonequeryresult.py将my_script.py替换为您的脚本名称。…

SpringBoot(tedu)——day01——环境搭建

SpringBoot(tedu)——day01——环境搭建 目录SpringBoot(tedu)——day01——环境搭建零、今日目标一、IDEA2021项目环境搭建1.1 通过 ctrl鼠标滚轮 实现字体大小缩放1.2 自动提示设置 去除大小写匹配1.3 设置参数方法自动提示1.4 设定字符集 要求都使用UTF-8编码1.5 设置自动编…

LDO的强力对手

开题前咋们先来温习下LDO的特点以及选型要点: 特点:纹波噪声小,响应快,低静态电流,外围电路简单;损耗大,输出电流小。常用于小电流的模拟电路供电。 选型要点:纹波噪声&#xff0c…

TEX:文档的布局与组织

文章目录标准的类选项指定纸张大小页面格式其他选项与某些选项相关的参数页面样式页眉页的编号fancyhdr页眉页脚宏包(重)定义fancy页面样式Using extramarks文档中页面风格切换与段落有关的距离页面格式单双列页面文档中的部分标题摘要章节附录书的结构目录表自动条目显示目录表…

XMLHttpRequest、ajax、Promise、axios、async await

1.XMLHttpRequest(xhr) 什么是xhr xhr是浏览器提供的js对象,通过它来向服务器来请求资源。jquery中的Ajax是基于xhr对象来封装资源的 使用xhr发起get请求 // 1. 创建 XHR 对象var xhr new XMLHttpRequest()console.log(xhr, 我是xhr);// 2. 调用 open 函数xhr.…

性能优化(2)-渲染优化

一、渲染优化 如果把浏览器呈现页面的整个过程一分为二,前面所讲的主要是浏览器为呈现页面请求所需资源的部分;本章将主要关注浏览器获取到资源后,进行渲染部分的相关优化内容。 在前面的前端页面的生命周期课程中,介绍过关键渲染路径的概念,浏览器通过这个过程对HTML,CSS, J…