Linux动态库和静态库

1,手动制作静态库

1,如何形成静态库文件

做库时,头文件(.h)必须暴露,源文件(.c)必须隐藏。

操作:将需要形成库的文件编译成.o文件:

然后用指令:ar -rc libmy_stdio.a my_stdio.o my_string.o

其中,如果形成库文件前缀必须是lib,后缀必须是.a,后面可以加版本号。

这时候就可以把头文件和库文件交给另外一个人使用。

2,如何使用静态库

a,在系统层面导入库文件

首先拿到别人给的头文件和库文件,我们需要去系统路径下安装别人给的头文件和库文件:

安装头文件:sudo cp*.h /usr/include/

安装库文件:sudo cp libmy_stdio.a /lib64/

这个时候在c文件里包头文件就可以找得到库文件:

                  

下面编译一下利用别人库函数的文件:

这个时候发现会报错,因为gcc只认自己的标准库,我们写的库属于第三方文件,gcc不认识,这时候要让gcc找到可以用指令:

gcc main.c -l my_stdio(注意!!!这里要去掉库文件的前缀和后缀)

可以看到这时候编译成功!所以我们学到了gcc的一个新指令 -l,引入指定名称的第三方库名称

b,如果头文件和库文件在同一目录下怎么使用

我们先把之前我们导入系统中库文件删除:

rm  /usr/include/my_*

rm /lib64/libmy_stdio.a

这时我们用gcc main.c -o main会发现程序无法编译:

可以看到系统根据c中写的头文件找不到库文件,此时在与它同名文件夹下有库函数文件。

这时用gcc main.c -o mian -lmy_stdio会发现也不行:

所以得出一个结论,gcc在查找静态库时不会在当前路径下查!

这个时候可以引入gcc的另一个指令:-L(告诉编译器,编译时查找库在指明的路径下找)

操作:gcc main.c -o main -L. -lmy_stdio

这时成功在同文件下使用静态库

c,如何封装Makefile和怎么发布静态库

首先完成.o文件的编译,然后形成库文件:

再将c文件依次编译成.o文件:

这样就可以自动形成库:

那么我们怎么发布?

这里引用一个小知识,再makefile中也是可以调用系统接口的:

这个时候就可以将写好的stdc压缩然后发给别让人用。那么假设我就是那个别人,那么我该怎么用别人打包好的库文件?

gcc指令中-I可以去指定路径下寻找头文件:

gcc main.c -I stdc/include -Lstdc/lib -lmy_stdio

2,如何手动制作动态库

1,如何形成动态库文件?

在前面章节中已经了解了静态库怎么创建,那么动态库和静态库的创建方式类似,我们直接在makefile中修改:(注意,动态库的后缀是.so)

gcc中加入-shared,可以告诉gcc不要形成可执行程序,帮我形成so库

这个时候make一下:

可以看到里面多了一个库函数文件,使用方法就是和之前一样把头文件和库文件分别拖进系统中的include和lib64文件夹中,就可以直接:

gcc main.c -lmy_stdio就可以直接运行这里就不做展示。

2,如何使用动态库

a,当动态库与main .c同文件

gcc main.c -o main -L. -lmy_stdio

讲一个系统指令:ldd,可以用来查可执行程序依赖哪些程序

可以看到main可执行程序依赖这个库文件,

如果把库删了:

就会显示找不到库文件。

3,发布动态库

流程和静态库一样:

但是这个时候gcc main.c -o main -I stdc/include -Lstdc/lib -lmy_stdio

会发现形成的main执行不了:

会发现他的ldd为空,这时因为在main运行的时候与gcc没有关系,gcc找到了链接文件不代表可执行文件找到了,os要加载你对程序,但是系统找不到动态库。

4,如何给系统指定路径找动态库

1,拷贝到默认路径下(前面已强调多次)

2,建立软链接:

sudo ln -s /路径/库名 /lib64/同名.so就可以建立软链接:

这时就可以运行程序。

3,Linux系统中,os可以根据环境变量查动态库

这个时候可以用:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH: +路径也可以:

如果想永久加env可以vim .bash.src中加入export ....

4,讲路径写到.conf文件里

touch /etc/ld.so.conf.d/2024.conf

这时将库的路径写道2024.conf中:

然后需要用到指令ldconfig加载一下:

其中1方法和3方法比较常用,如果同时提供了so a文件呢?

gcc,g++会默认使用动态库,如果需要他只用静态库,可以加-static

这时去掉路径中的.so和-static:

可以跑?为什么?

如果只提供静态库,但是链接方法是静态库请见下篇分晓。

5,原理上理解动态库

我们知道,在堆区和栈区直接有一个共享区:

进程在执行库的方法,是在自己的地址空间中跳转运行

                                                                     

然后动态库他是从磁盘加载到内存中通过页表的映射到共享区给代码使用

                                                        

这个时候如果有其他程序也需要调用这个库,就直接从页表映射到内存中找库:

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

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

相关文章

java基础之 String\StringBuffer\ StringBuilder

文章目录 String字符串的创建为什么说String是不可变的?创建后的字符串存储在哪里?字符串的拼接String类的常用方法 StringBuilder & StringBuffer使用方法验证StringBuffer和StringBuilder的线程安全问题 总结三者区别什么情况下用运算符进行字符串…

告别繁琐统计,一键掌握微信数据

微信数据管理的挑战在数字时代,微信已成为我们日常沟通和商业活动的重要工具。然而,随着微信号数量的增加,手动统计每个账号的数据变得越来越繁琐。从好友数量到会话记录,再到转账和红包,每一项都需要耗费大量的时间和…

bert-base-chinese模型使用教程

向量编码和向量相似度展示 import torch from transformers import BertTokenizer, BertModel import numpy as npmodel_name "C:/Users/Administrator.DESKTOP-TPJL4TC/.cache/modelscope/hub/tiansz/bert-base-chinese"sentences [春眠不觉晓, 大梦谁先觉, 浓睡…

HTML+CSS科技感时钟(附源码!!!)

预览效果 源码(直接复制使用) <!DOCTYPE html> <html lang"zh-Hans"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>科技感时钟</…

PyQt5实战——UTF-8编码器功能的实现(六)

个人博客&#xff1a;苏三有春的博客 系类往期文章&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; PyQt5实战——多脚本集合包&#xff0c;UI以及工程布局&#xff08;二&#xff09; PyQt5实战——多脚本集合包&#xff0c;程序…

‌MySQL中‌between and的基本用法‌

文章目录 一、between and语法二、使用示例2.1、between and数值查询2.2、between and时间范围查询2.3、not between and示例 BETWEEN AND操作符可以用于数值、日期等类型的字段&#xff0c;包括边界值。 一、between and语法 MySQL中的BETWEEN AND操作符用于在两个值之间选择…

微服务系列一:基础拆分实践

目录 前言 一、认识微服务 1.1 单体架构 VS 微服务架构 1.2 微服务的集大成者&#xff1a;SpringCloud 1.3 微服务拆分原则 1.4 微服务拆分方式 二、微服务拆分入门步骤 &#xff1a;以拆分商品模块为例 三、服务注册订阅与远程调用&#xff1a;以拆分购物车为例 3.1 …

jvm学习笔记-轻量级锁内存模型

一&#xff0c;轻量级锁 LockRecord的那个第一个成员变量是拷贝对应锁定了的java对象资源的MarkWord&#xff0c;Lock Record有一个Ptr指针刚开始指向自己&#xff0c;后面这个指针存储在锁定资源的java对象的markword中&#xff0c;后续可以通过java对象的MarkWord快速定位到…

【力扣专题栏】面试题 01.02. 判定是否互为字符重排,如何利用数组模拟哈希表解决两字符串互排问题?

题解目录 1、题目描述解释2、算法原理解析3、代码编写(1)、两个数组分别模拟哈希表解决(2)、利用一个数组模拟哈希表解决问题 1、题目描述解释 2、算法原理解析 3、代码编写 (1)、两个数组分别模拟哈希表解决 class Solution { public:bool CheckPermutation(string s1, stri…

指针和内存地址的关系(uint8_t和uint32_t的指针有什么区别)

指针在我们的学习中非常常见&#xff0c;有些人只是了解指针的基本概念&#xff0c;却不知道他的原理&#xff0c;到时候使用起来一头雾水&#xff0c;接下来我将对指针做出一些解释说明。 一、数据是如何存储的&#xff1a; 我们初始化一个int变量a,变量a会存储到内存中&#…

flutter 专题四 Flutter渲染流程

一、 Widget - Element - RenderObject关系 二、 Widget 、Element 、RenderObject 分别表示什么 2.1 Widget Widget描述和配置子树的样子 Widget就是一个个描述文件&#xff0c;这些描述文件在我们进行状态改变时会不断的build。但是对于渲染对象来说&#xff0c;只会使用最…

高效内容营销策略提升品牌影响力与客户忠诚度

内容概要 内容营销是一种通过创造和分享有价值的内容&#xff0c;以吸引特定目标受众并促进品牌发展的策略。这种营销形式不仅仅注重产品的直接推广&#xff0c;更着眼于与受众之间建立长期的信任关系。有效的内容营销能够提升品牌在市场中的影响力和客户的忠诚度&#xff0c;…

git 入门作业

任务1: 破冰活动&#xff1a;自我介绍任务2: 实践项目&#xff1a;构建个人项目 git使用流程&#xff1a; 1.将本项目直接fork到自己的账号下&#xff0c;这样就可以直接在自己的账号下进行修改和提交。 这里插一条我遇到的问题&#xff0c;在fork的时候没有将那个only camp4的…

NumPy Ndarray学习

1.NumPy Ndarray 对象简介 NumPy 最重要的特点是其 N 维数组对象 ndarray&#xff0c;它是一系列同类型数据的集合&#xff0c;以 0 下标为开始进行集合中元素的索引。ndarray 对象是用于存放同类型元素的多维数组。ndarray 中的每个元素在内存中都有相同存储大小的区域。 2.N…

网络层3——IP数据报转发的过程

目录 一、基于终点的转发 1、理解 2、IP数据报转发过程 二、最长前缀匹配 1、理解 2、主机路由 3、默认路由 三、二叉线索查找 一、基于终点的转发 1、理解 理解什么叫终点转发 IP数据报的传递&#xff0c;交给路由器后 可不可以做到直接发送给目的主机呢&#xff1f;…

【UGUI】为射击游戏添加动态显示的分数和血量到UI界面

项目背景 在这个项目中&#xff0c;我们希望实现一个简单的游戏系统&#xff0c;其中玩家可以通过击中目标来获得分数&#xff0c;同时通过与怪物碰撞来减少血量。分数和血量需要在游戏界面上实时显示&#xff0c;以便玩家能够随时了解自己的状态。 技术实现 1. 静态变量的使…

「C/C++」C/C++标准库 之 #include<cstdlib> 通用工具函数库

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

CTF压缩包破解神器bkcrack教程和详细使用过程

kali安装bkcrack教程和详细使用过程 1.bkcrack介绍&#xff1a;2.bkcrack功能&#xff1a;3.bkcrack安装&#xff1a;Linux-Kali下&#xff1a;测试&#xff1a;Windows下安装&#xff1a; 4.bkcrack的使用方法&#xff1a;4.1查看相关参数4.2恢复内部密钥从 zip 档案中加载数据…

基于Python的乡村居民信息管理系统【附源码】

基于Python的乡村居民信息管理系统 效果如下&#xff1a; 系统主页面 系统登录页面 管理员主页面 居民管理页面 政务学习页面 土地信息管理页面 个人信息管理页面 居民登陆页面 村委人员主页面 研究背景 随着信息技术的飞速发展和乡村振兴战略的深入实施&#xff0c;传统的乡…

UI设计公司—兰亭妙微—提供轨道交通行业UI设计

蓝蓝设计工作室2008年开始&#xff0c;2011年正式成立北京兰亭妙微科技有限公司&#xff0c;主创清华团队&#xff0c;专注软件和互联网ui设计开发&#xff0c;擅长企业信息化管理、监控、大数据软件UIUE咨询和设计开发服务。立足UI&#xff0c;一直在学习进步。交通行业UE UI解…