静态库与动态库的制作和使用

个人主页:Lei宝啊 

愿所有美好如期而遇


目录

前言

库?

为什么要使用库

静态库

静态库的制作和使用

动态库

动态库的制作和使用

四种方法:

直接将库拷贝(安装)到系统路径中

配置环境变量

软链接

添加配置文件

动态库和静态库同时存在

总结


前言

首先提到,我们用过库吗?C语言,C++其实我们一直都在使用库,你一定听说过C标准库,博主这里介绍动静态库使用的是云服务器,在云服务器上,默认安装的是动态库,静态库默认是没有安装的,我们默认编译程序,链接的是动态库,如果想要链接静态库,需要安装,并加上static选项,我们举例来说明:

首先,我们来安装C静态库(博主已经安装了)

sudo yum install glibc-static

接着就是C++静态库

sudo yum install libstdc++-static

我们随便写一个C文件,然后先进行编译:

我们使用gcc编译器,默认就是使用动态库进行链接,接着我们使用ldd查看可执行程序链接的是什么库,我们可以看到链接的是libc.so.6这个库,查看库的名字,就是去掉前缀lib,去掉后缀so.6,这个库的名族就叫c,也就是我们的C标准库,而在linux下,.so是动态库的后缀,.a是静态库的后缀。

接着我们对这个文件进行静态编译:

gcc 文件名 -static

我们可以看到,ldd已经无法查看这个文件,那么我们使用file指令来查看这个文件,可以清楚的看到statically linked,这就是静态链接的意思。

库?

为什么要使用库

我们先来准备一些文件:

我们实现了加减乘除。

如果说,这些文件要给别人使用,那么如果没有库,他们会怎么使用?是这样:

当然,我们也可以这样:

如果说有更多的文件呢?成百上千个的话,难道一个个的敲吗?所以我们需要库,库就是将这些.c文件编译后形成的.o文件打包乘一个文件,然后我们进行使用。

静态库

静态库的制作和使用

我们先新建一个目录,将所有.c和.h文件拷贝进来,接下来我们将制作一个静态库。(在我们给交付别人时,当然是不想给他发源文件的,但是我们可以给他发.o文件和头文件,他照样可以使用,但是文件太多别人用着也麻烦,所以我们就将这些文件打包成库)

ar -rc 文件

我们将这些文件一次性打包后并发布:

上面第一行代码,意思是将.c文件全部替换成.o文件,wildcard意思是寻找所有.c文件,下面的%.o:%.c和下面一行代码意思是寻找所有.c文件编译成,o文件。

output就是我们要进行的打包操作。

我们来看make后效果:

接着我们进行打包:

假设我们有个user目录,将这个包给给用户,用户有个test.c文件,那么用户怎么使用呢?

首先进行解包:

tar -zxf 包名

我们在进行与静态库的链接时,如果我们的库和头文件不在当前目录,头文件路径需要使用-I(大i)指明,库路径需要使用-L指明,同时需要使用-l(小L)指明链接的库的名字。

或者指明头文件路径后,给出库路径和库的全称(不要去掉前后缀),这样就相当于给了路径和库名,也是可以的。

动态库

动态库的制作和使用

生成动态库需要的.o文件需要进行特殊处理:

我们加上-fPIC选项,同时生成动态库不需要其他指令,使用gcc就可以,加上-shared选项。

下面这种情况我们怎么办?同时,为什么静态库这样链接后,运行时没有这样的报错?

四种方法:

头文件搜索路径:

  • 当前路径 
  • 系统默认路径:/usr/include

库搜索路径:

  • 由环境变量 (LD_LIBRARY_PATH) 辅助搜索(动态库) 
  • 系统指定路径:/lib64  或者 /usr/lib64

直接将库拷贝(安装)到系统路径中

我们这样做,在生成可执行程序时,也不需要指定库路径,在执行时,当然也不需要,但是,非官方库不要安装在系统目录下。

 

配置环境变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:我们的路径 

但是这样做的话只是临时添加,当我们再次登录时,环境变量从配置文件读取,我们还是没有永久添加。

我们可以这样做:

我们可以在这里面修改,下次登录时环境变量读取配置文件,我们也就不用再去添加了。

软链接

现在我们对库进行软链接,并安装在系统目录下。

删除:

添加配置文件

/etc/ld.so.conf.d/

我们添加一个后缀为.conf的文件,将库路径写进文件中即可。

注意:需要提权打开系统文件,否则无法进行写入

但是我们发现还是找不到,这是因为我们修改了配置文件,操作系统并不清楚,所以我们需要执行一条命令来使刚刚的命令生效

动态库和静态库同时存在

如果动静态库同时存在,那么gcc默认使用的是哪个库呢?

很显然,两者同时存在时,gcc默认选择使用动态库。

如果我们一定要静态链接,需要加上-static选项:

如果我们只提供静态库,那么他只能静态链接,但是整体不一定是静态链接,只是我们这个库局部静态链接。

如果我们只提供动态库,却非要静态链接,那么连接器就会报错:

总结

制作静态库 ar  -rc  -o  文件名    一系列.o文件

制作动态库 gcc  -shared  -o  文件名    一系列.o文件

        使用静态库                 gcc main.c -I(大i) 头文件路径 -L库路径  -l(小l)库名 

或者(头文件在当前路径)     gcc main.c 路径/库

        使用动态库   执行可执行程序时,需要四种方法,或者直接gcc main.c 路径/库(.h 在  ./)

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

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

相关文章

【Hadoop大数据技术】——MapReduce经典案例实战(倒排索引、数据去重、TopN)

📖 前言:MapReduce是一种分布式并行编程模型,是Hadoop核心子项目之一。实验前需确保搭建好Hadoop 3.3.5环境、安装好Eclipse IDE 🔎 【Hadoop大数据技术】——Hadoop概述与搭建环境(学习笔记) 目录 &#…

蓝桥杯2023年省A(一波三折的)【买瓜】折半搜索+剪枝+排序

题目:洛谷 P9234 [蓝桥杯 2023 省 A] 买瓜 折半搜索 一开始觉得像dp,试着写了,显然过不了,但我实在觉得搜索也过不了啊,去看题解,发现使用了折半搜索(每天都觉得啥都不会捏 折半搜索就是先搜一…

HarmonyOS NEXT应用开发—发布图片评论

介绍 本示例将通过发布图片评论场景,介绍如何使用startAbilityForResult接口拉起相机拍照,并获取相机返回的数据。 效果图预览 使用说明 通过startAbilityForResult接口拉起相机,拍照后获取图片地址。 实现思路 创建CommentData类&#…

Rocky Linux 基本工具的安装

1.系统安装后先查看ip地址 ip addr 2.安装net工具 :ifconfig yum install net-tools 3.安装gcc ;选择都选 y yum install gcc yum install gcc-c 4.安装tcl yum install -y tcl 5.安装lsof (端口查看工具) yum install l…

GIF图片压缩的几种方法

影响GIF大小的因素 尺寸大小帧速率颜色动效复杂程度时长 一般输出gif大小是最后一步,所以前期的尺寸,颜色,动效,时长,这些我们都不能动,但是客户往往要求在100kb且不糊的gif,这时候就比较头疼。 方法1&a…

十五、自回归(AutoRegressive)和自编码(AutoEncoding)语言模型

参考自回归语言模型(AR)和自编码语言模型(AE) 1 自回归语言模型( AR) 自回归语言模型(AR)就是根据上文内容(或下文内容)预测下一个(或前一个&…

【MatLab】之:Simulink安装

一、内容简介 本文介绍如何在 MatLab 中安装 Simulink 仿真工具包。 二、所需原材料 MatLab R2020b(教学使用) 三、安装步骤 1. 点击菜单中的“附加功能”,进入附加功能管理器: 2. 在左侧的“按类别筛选”下选择Using Simulin…

Docker 安装 Keycloak 开源身份认证服务

Keycloak说明 Keycloak是一款开源的认证授权平台,在Github上已有9.4kStar。Keycloak功能众多,可实现用户注册、社会化登录、单点登录、双重认证 、LDAP集成等功能。 安装 Keycloak 下载 Keycloak 镜像:使用以下命令从 Docker Hub 下载 Keyc…

STM32系列——F103C8T6 控制SG90舵机(HAL库)

文章目录 一、舵机控制原理二、.CubeMX配置配置RCC、SYS、时钟树配置RCC配置SYS配置时钟树配置定时器产生PWM波形 Keil5代码接线图及效果如果您发现文章有错误请与我留言,感谢 一、舵机控制原理 舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平…

【正则表达式】正则表达式里使用变量

码 const shuai No My Name Is ShuaiGe.match(new RegExp(shuai, gi)); //↑↑↑↑↑↑↑↑ //等同于 //↓↓↓↓↓↓↓↓ /No/gi.test(My Name Is ShuaiGe)用作领域 搜索的字符动态改变,例如↓模糊搜索例: 一个文本宽,输入文本模糊搜索用…

Explain 关键字

优质博文:IT-BLOG-CN explain关键字可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理 SQL 语句的。分析查询语句或表结构的性能瓶颈。执行语句:explain SQL语句。表头信息如下: 一、ID 参数 select 查询的序列号&…

免费开源:自动会议记录接口调用|语音识别接口|语音识别API

一、开源项目介绍 一款多模态AI能力引擎,专注于提供自然语言处理(NLP)、情感分析、实体识别、图像识别与分类、OCR识别和语音识别等接口服务。该平台功能强大,支持本地化部署,并鼓励用户体验和开发者共同完善&#xf…