动态库和静态库

文章目录

  • 一、 静态库
  • 二、动态库


一、 静态库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库,因为他已经在你字节写的程序中。
编译静态库
在这里插入图片描述
将所有的.h文件拷贝到lib/include中,是为了实现头文件的包含,里面是方法的声明,将所有.a文件拷贝到lib/mymathlib中,里面是各种静态库。
生成静态库使用ar -将.o文件生成静态库
[root@localhost linux]# ar -rc libmymath.a add.o sub.o
ar是gnu归档工具,rc表示(replace and create)

在这里插入图片描述
在当前目录下创建test目录,然后进入test目录将上级目录的lib拷贝到test目录下
在这里插入图片描述
main.c程序使用带路径的头文件,但是却是找不到方法的实现,而且这样带路径的头文件一般是不常用的。然后直接使用头文件又会发生找不到的现象
在这里插入图片描述
可以使用-I链接找到头文件所在路径
在这里插入图片描述
给出头文件所在的路径在编译链接时会去这个路径下搜索头文件,并且不需要指出需要哪一个头文件因为在源文件中已经指出需要的头文件。若是没有指出头文件路径,那么会去系统指定路径下查找若是都找不到就会出错,然后还可以将头文件的路径拷贝到当前路径下,一般你在哪一个路径下创建的头文件他会去当前路径搜索,不过这是别处拷贝过来的,可以将头文件拷贝到当前路径下。
在这里插入图片描述
在链接时就不会在指定链接头文件的路径,只是找不到方法的实现,链接头文件已经就绪,接下来链接库
链接库需要先找到库所在路径然后还要指定链接哪一个库,因为使用时就算知道了路径但是这一个路径下可能会存在多个静态库,所以需要指定库名 用-L指定库路径,然后-l指定库名,不过静态库链接是需要去掉前缀和.a后缀,一般是l仅紧紧跟着库名
在这里插入图片描述
在这里插入图片描述
第三方库在使用的时候必定要使用gcc -l
库名=去掉前缀和后缀若是不想这么做应该将库和头文件安装到系统目录下(建立软链接)
查看一个可执行程序的链接库
在这里插入图片描述
它的链接库是.so,gcc默认链接库是以动态链接的方式链接,当有动态链接又有静态库,它会首先链接动态库,若是没有提供动态库,gcc会以静态链接的方式链接静态库,若是系统中有两者都有,可以用-static链接静态库。
直接用库,将其拷贝到系统路径下
将当前路径拷贝到系统路径下,普通用户需要提权
在这里插入图片描述
在这里插入图片描述
把头文件和库文件拷贝到系统路径下,那么直接gcc编译时就不会报错了,不过还是要指定链接库名
在这里插入图片描述
将来用其他人使用的库都是要先将库的地址拷贝到自己系统路径下,为库的安装!
不拷贝头文件和库文件安装直接用,可以使用软链接
建立软链接到系统路径下,建立到系统路径下都是需要提权的
在这里插入图片描述

在这里插入图片描述
建立软链接在使用时使用软链接即可。链接头文件和库到系统路径下这样不用每次gcc时都要使用很长的路径,不用这么麻烦使用起来方便!库要使用时将其拷贝到系统搜索路径下!

二、动态库

动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
多个源文件形成动态库,即形成动态库又形成静态库
源文件编译成.o文件然后形成库!先源文件形成.o文件
-fPIC形成与位置无关码

在这里插入图片描述
把.o文件打包形成库,形成静态库是ar,形成动态库是gcc直接编译,将所有.o文件形成一个库需要用到shared形成一个共享库
在这里插入图片描述
动态库带着可执行的动态库要和可执行程序产生关联,也就是动态库要被加载,以可执行程序的方式加载到内存!他不能单独执行,并不是不能执行。即形成静态库有形成动态库在makefile中all,所有的都形成每一次都执行.PHONY:all
在这里插入图片描述
打包成库之后别人就可以使用
在这里插入图片描述
库中没有main函数
使用动态库也和静态库一样的,同样要找到路径然后链接库
在这里插入图片描述
链接动态库之后不能立即使用这个可执行程序,它要结合动态库才可以出结果,它要去找到动态库,因为它的实现在动态库中
not found
在这里插入图片描述
要告诉动态库在哪
把动态库拷贝到当前路径下,再gcc一次就可以执行了
在这里插入图片描述
程序形成和编译器没关系了,要去找动态库,所有动态库在哪里要告诉系统系统充当一个加载器的工作!那么这怎么找到动态库可以将动态库拷贝到系统路径下,系统去找的时候就去搜索路径下搜素即可–>建立软链接
对于一个程序加载器找不到动态库的方法:
1.建立软链接在系统路径/usr/lib64/
2.拷贝到系统默认路径/usr/lib64/下
3.将动态库添加到环境变量LD_LIBRARY_PATH中
LD_LIBRARY_PATH是动态库的搜素路径,可以将动态库路径加到环境变量中。
在这里插入图片描述

4./etc/ld.so.conf.d建立自己的动态库路径的配置文件,然后重新ldconfig即可,把动态库路径添加到配置文件中即可,这个配置文件中添加的是永久有效的!
这么多种方法,其实在用别人库的时候是用最简单方法直接安装到系统(拷贝)就可以了!
在这里插入图片描述

使用外部库
系统中其实有很多库,它们通常由一组互相关联的用来完成某项常见工作的函数构成。比如用来处理屏幕显示情况的函数(ncurses库),图形化界面的操作。
动态库在运行的时候是要被加载到内存的,而一个动态库会被多个源文件使用,常见的动态库被所有的可执行程序都要使用在动态链接时,这个动态库啊就是一一个共享的库,当将一个动态库给删除之后,那些与这个动态库相关的可执行程序都不能执行,共享库失去所有依赖共享库而生的可执行程序就不再能够执行它的功能,所有动态库在被加载之后,会被所有进程共享!!并且这个动态库不会被重复加载加载一次就够了,就像是一个共享区而在操作系统中可能存在多个共享库操作系统同样要对共享库管理!动态库共享是如何做到的?
动态库是一个文件,磁盘中的普通文件,他把所有的.o文件打包程库,然后这个库加载到内存中,在加载到内存中时并且将库的物理地址经过页表映射到进程地址空间中的共享区中这样就达到在进程地址空间上对共享库访问。所有建立映射之后,在执行任何代码时都是在我们的进程地址空间中进行执行,函数跳转即可。那么怎么跳转到共享库?共享库中有起始地址,然后库函数的地址相对于共享区的地址是一个绝对地址经过地址偏移就可以使跳转成功!

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

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

相关文章

2024年腾讯云服务器价格一览表

随着云计算技术的快速发展,越来越多的企业和个人开始选择使用云服务器来满足他们的数据存储和计算需求。腾讯云作为国内领先的云服务提供商,其服务器产品因性能稳定、安全可靠而备受用户青睐。那么,2024年腾讯云服务器的价格情况如何呢&#…

网络运输层之(3)GRE协议

网络运输层之(3)GRE协议 Author: Once Day Date: 2024年4月8日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文档可参考专栏:通信网络技术_Once-Day的…

OpenHarmony多媒体-video_trimmer

简介 videotrimmer是在OpenHarmony环境下,提供视频剪辑能力的三方库。 效果展示: 安装教程 ohpm install ohos/videotrimmerOpenHarmony ohpm环境配置等更多内容,请参考 如何安装OpenHarmony ohpm包 。 使用说明 目前支持MP4格式。 视频…

ansible模块实战-部署rsync服务端

目录 1、根据部署流程所用到的命令找出模块 2.实战部署 2.1 服务部署:yum 安装 2.2 准备好rsync服务的配置文件 ,并将配置文件通过copy模块分发给192.168.81.136这台受控主机 2.3 创建虚拟机用户 2.4 创建密码文件和改权限 2.5 模块对应目录&…

《QT实用小工具·二十九》托盘图标控件

1、概述 源码放在文章末尾 托盘图标控件 可设置托盘图标对应所属主窗体。 可设置托盘图标。 可设置提示信息。 自带右键菜单。 下面是demo演示: 项目部分代码如下: #ifndef TRAYICON_H #define TRAYICON_H/*** 托盘图标控件* 1. 可设置托盘图标…

基于SpringBoot+Vue的大学生心理咨询系统(源码+文档+包运行)

一.系统概述 使用旧方法对学生心理咨询评估信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在学生心理咨询评估信息的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。 这次…

Unity解决:导出安卓apk 安装时报错:应用未安装:软件包似乎无效

Unity2018.4.36 导出安卓apk 安装时报错:应用未安装:软件包似乎无效 解决办法:因为安装到安卓12 需要添加添加过滤规则 在AS工程AndroidManifest.xml 添加过滤规则即可。 android:exported"true"

算法训练营第25天回溯(分割)

回溯算法(分割) 131.分割回文串 力扣题目链接(opens new window) 题目 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。 返回 s 所有可能的分割方案。 示例: 输入: “aab” 输出: [ [“aa”,“b”], [“a”,“…

Matlab 将数据写入excel文件

Matlab 将数据写入excel文件 函数:writematrix 功能:将数据写入文件 语法 writematrix(A) writematrix(A,filename) writematrix(___,Name,Value) 说明 writematrix(A) 将同构数组 A 写入以逗号分隔的文本文件。文件名为数组的工作区变量名称&…

IDEA如何配置 Maven 及 Maven 安装过程(详细版)

IDEA如何配置 Maven(详细版) 一、安装Maven 1、下载Maven 安装包 官网:https://maven.apache.org/ 2、点击Download 》选择 apache-maven-3.8.6-bin.zip 3、下载后解压产生此文件夹 4、文件夹如图所示 二、环境变量配置 1、点击我的电脑-…

爬虫——如何应对具有反爬机制的网站

🍅 写在前面 👨‍🎓 博主介绍:大家好,这里是hyk写算法了吗,一枚致力于学习算法和人工智能领域的小菜鸟。 🔎个人主页:主页链接(欢迎各位大佬光临指导) ⭐️近…

web安全学习笔记(12)

记一下第十六节课的内容。 一、jQuery Ajax 我们要先下载jQuery。 首先我们转移到template目录下,准备把jQuery下载到这下面。 直接wget下来就可以了。 这样我们就下载好了jQuery,下面我们学习如何使用。 jQuery 调用 ajax 方法 格式:$.…

【前端面试3+1】16 TCP与UDP的区别、如何清除浮动、哪些原因造成阻塞页面渲染、【相同的树】

一、TCP与UDP的区别 TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种常用的网络传输协议,它们有以下几点区别: 1、连接性: TCP是面向连接的协议,通信双方在…

视频拍摄知识+AIGC数据预处理

视角 参考链接:https://www.polarpro.com/blogs/polarpro/filmmaking-101-types-of-camera-shots-and-angles Low Angle Shot 低角度拍摄、horizontal Shot 平视、Dutch Angle Shot 荷兰角斜拍、High Angle Shot 高角度拍摄、Bird’s-eye / Aerial Shot 鸟瞰 / 航…

最大公约数和最小公倍数(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现最大公约数函数&#xff1b; int max(int x, int y) {//初始化变量值&#xff1b;int judge 1;//运算&#xff1b;judge x %…

【智能算法】CEC2017测试集

目录 1.背景2.CEC2017测试集3.参考文献 1.背景 IEEE 国际进化计算大会&#xff08;IEEE Congress on Evolutionary Computation&#xff0c;IEEE CEC&#xff09;是进化计算领域中规模最大、影响最重要的会议之一。为了公平评估算法的优化性能&#xff0c;该会议在优化竞赛中提…

工作必备!快速了解多微信高效管理工具

在如今社交媒体和移动即时通信的时代&#xff0c;微信已成为人们工作和生活中不可或缺的一部分。而对于那些需要同时管理多个微信账号的用户来说&#xff0c;微信管理工具则是一项绝对必备的利器。 1、多微信同时登录 通过微信管理系统&#xff0c;我们可以在同一个界面内同时…

2024.4.18

思维导图 数据库 #include <myhead.h> //添加学生信息 void insert_stu(sqlite3* sq,char* errMsg) {char text[128];int ID,age,height;char name[10];scanf("%d%s%d%d",&ID,name,&age,&height);sprintf(text,"insert into Student values …

【论文速读】| 大语言模型是边缘情况模糊测试器:通过FuzzGPT测试深度学习库

本次分享论文为&#xff1a;Large Language Models are Edge-Case Fuzzers: Testing Deep Learning Libraries via FuzzGPT 基本信息 原文作者&#xff1a;Yinlin Deng, Chunqiu Steven Xia, Chenyuan Yang, Shizhuo Dylan Zhang, Shujing Yang, Lingming Zhang 作者单位&…

数学建模--蒙特卡罗法MATLAB代码保姆式解析

1.简单介绍 2.思想的实际运用 我们利用蒙特卡罗法的思想求解圆周率π的值&#xff0c;这里求得的肯定是近似值&#xff0c;我们是通过大量的模拟实验&#xff0c;利用概率求解的&#xff0c;但是这个值和我们的精确值之间还是有一定的误差的&#xff1b; 我们的思想就是在半径为…