Linux——动态库

news2024/10/6 10:39:09

目录

制作并发布动态库 

使用动态库 

使用动态库程序运行时的错误


制作并发布动态库 

静态库的代码在链接的时候会被拷贝进对应的可执行程序内部,动态库则不需要拷贝。

动态库在形成目标文件时,需要加一个选项

-fPIC:形成一个与位置无关的二进制文件(动态库在哪都无所谓,静态库会被拷贝到具体某个特定位置)

 readelf -S mymath.o:可读取mymath.o对应的二进制内容

 接下来形成动态库

gcc -shared myprint.o mymath.o -o libhello.so

前缀lib后缀.so,shared让形成一个动态库

编写makefile,上面是形成动态库,下面是形成静态库,这里同时生成俩个库

 make之后,既有静态库又有动态库

 

 进行发布

 

 此时我们可以看到已经产生了文件

 

 稍作修改,将文件夹改名为output

使用动态库 

 我们把整个output打包,给别人之后,经过解压就可以使用

 写一个.c文件

 -I output/include 告诉gcc编译器头文件在哪

 但仍然报错,意思是Print和addToTarget没有引用

 第一个框告诉库在哪,第二个说是说明链接哪个库,注意这里是-lhello 去掉前后缀

 此时编译成功,但这里有俩个库,一个动态一个静态

 但此时运行不了,这里报错不能打开动态库

 此时我们发现程序依赖的是动态库,这是因为当静态库和动态库同时存在时,优先使用动态库

把动态库移出去

 ldd a.out它仍然是一个动态链接的可执行程序,但是动态库被我们移除,此时程序仍然能执行,并可以打印正确结果,打印结果为hello world res:5050

 这是因为当动态库和静态库同时存在时gcc优先使用动态库,当没有动态库时,会使用静态库。

当动态库和静态库同时存在时,我们如果要用静态库只需加 -static,这样就可使用静态库


 

 这里形成了可执行程序a.out,a.out同时也是磁盘上的文件,动态库libhello.so也是磁盘上的文件,静态库会被加载到内存当中,动态库是一个独立的库文件,动态库可以和可执行程序分批加载,而如果使用静态库,可执行程序中就会包含静态库的代码,可执行程序被加载到内存中时,静态库也被加载到了内存中(这里会被加载到代码区),动态库和页表建立映射关系,代码被加载到内存中时会被加载到共享区,需要使用这些代码时,程序会跳到共享区,所以静态库代码被加载到的地方是固定的,动态库有页表的存在,可以在共享区的任意位置。

 当有多个进程需要用该动态库时,只需要新的进程新添加一个映射关系即可

使用动态库程序运行时的错误

 回顾这里,编译都能成功,为什么一运行就出错呢?

先加载程序,再加载库,加载库的前提是要找到库,这里-L output/lib虽然指明了库的路径,但这个路径是告诉gcc库在哪,而运行加载的时候和gcc没关系。运行加载的时候应告诉操作系统加载器库在什么位置。

我们可以用LD_LIBRARY_PATH(库加载的搜索路径),这里是把自己动态库所在位置,放到库加载的搜索路径下

 我们对LD_LIBRARY_PATH进行查看,此时已经有了我们的动态库路径

 此时程序就能正常运行,但这种方法有一个缺点,关闭XSHELL后,重新登陆之后,该环境变量就没了,因为我们所导的这个环境变量是内存级别的环境变量,一旦退出就会被清理

如果想要他一直存在,我们就要修改配置文件,这个配置文件在/etc/ld.so.conf.d

我们只需在该路径下创建一个文件,后缀要加.conf

 之后我们把我们的动态库路径写进去即可

 

 

 更新环境变量

 

 此时可直接运行程序,./a.out 关掉程序之后,也能继续运行

 删除掉该文件 sudo rm /etc/ld.so.conf.d/test.conf

更新配置文件sudo ldconfig

之后./a.out程序运行出错

除这个方法外,我们还可以创建一个软链接

 我们可以看到该软链接已经存在于lib64目录下

 

 此时程序能正常运行,这是因为这个软链接,链接到了动态库。

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

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

相关文章

Yocto常用术语

Yocto常用术语 Yocto是一套开源、专为嵌入式定制的编译系统,它提供了toolset和开发环境,开发人员可以利用Yocto定制基于Linux的系统。Yocto官网介绍了其常用术语,官网链接Yocto Project Terms,了解这些术语可以加深对Yocto的认识…

第五章 高级数据管理

在第4章,我们审视了R中基本的数据集处理方法,本章我们将关注一些高级话题。本章分为三个基本部分。在第一部分中,我们将快速浏览R中的多种数学、统计和字符处理函数。为了让这一部分的内容相互关联,我们先引入一个能够使用这些函数…

低功耗广域网LPWAN 8大关键技术对比

物联网被认为是继计算机、互联网之后,世界信息产业发展的第三次浪潮,它的出现将大大改变人们现有的生活环境和习惯。智能家居、工业数据采集等场景通常采用的是短距离通信技术,但对于广范围、远距离的连接,远距离通信技术不可或缺…

分享146个ASP源码,总有一款适合您

ASP源码 分享146个ASP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 146个ASP源码下载链接:https://pan.baidu.com/s/1HG8AMPldOPHcEmMsGnVwMA?pwdg97k 提取码&#x…

矩阵的运算、运算规则及C语言实现

在人工智能运算和原理的过程中,我们需要了解非常多的数学知识,但是大学时候学的东西已经忘的差不多了,这里我把矩阵的一系列概念总结并复习一下,以便于大家在学习AI的时候要明白很多数学计算的物理意义,当年在学习线性代数的时候,我们不一定明白这些计算的意义,现在要和…

【图卷积网络】02-谱域图卷积介绍

注:本文为第2章谱域图卷积介绍视频笔记,仅供个人学习使用 目录1、图卷积简介1.1 图卷积网络的迅猛发展1.2 回顾,经典卷积神经网络已在多个领域取得成功1.3 两大类数据1.4 经典卷积神经网络的局限:无法处理图数据结构1.5 将卷积扩展…

代码随想录算法训练营第四十八天|● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

动态规划 一、198.打家劫舍 题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系…

流批一体计算引擎-7-[Flink]的DataStream连接器

参考官方手册DataStream Connectors 1 DataStream连接器概述 一、预定义的Source和Sink 一些比较基本的Source和Sink已经内置在Flink里。 1、预定义data sources支持从文件、目录、socket,以及collections和iterators中读取数据。 2、预定义data sinks支持把数据写…

Eclipse中的Build Path

Eclipse中的Build Path简介如果修改了Build Path中的中的JRE版本,记得还需要同步修改Java编译器的版本,如下图红框所示简介 Build Path是Java工程包含的资源属性合集,用来管理和配置此Java工程中【除当前工程自身代码以外的其他资源】的引用…

Vision Transformer 简单复现和解释

一些我自己不懂的过程,我自己在后面写了demo解释。 import torch import torch.nn as nnfrom einops import rearrange, repeat from einops.layers.torch import Rearrangedef pair(t):return t if isinstance(t, tuple) else (t, t) class PreNorm(nn.Module):…

数据库系统概念 | 第七章:使用E-R模型的数据库设计 | ER图设计| ER图转化为关系模型 | 强实体和弱实体

文章目录📚设计过程概览📚实体-联系模型🐇E-R数据模型🥕实体集🥕联系集🥕属性🐇E-R图📚映射基数🐇二元联系集⭐️🥕一对一🥕一对多🥕多…

二叉树的顺序结构——堆的概念实现(图文详解+完整源码 | C语言版)

目录 0.写在前面 1.什么是堆? 2.堆的实现 2.1 堆的结构定义 2.2 函数声明 2.3 函数实现 2.3.1 AdjustUp(向上调整算法) 2.3.2 AdjustDown(向下调整算法) 2.3.3 HeapCreate(如何建堆) …

更多的选择器 更多伪类选择器 颜色选中时写法 被选中的第一行文字 选中第几个元素

目录更多的选择器更多伪类选择器1. first-child2. last-child3. nth-child4. nth-of-type更多的伪元素选择器1. first-letter2. first-line3. selection更多的选择器 更多伪类选择器 1. first-child 选择第一个子元素 圈住的地方意思是:li 的第一个子元素设置为红…

第三篇:Haploview做单倍型教程3--结果解读

大家好,我是邓飞,这里介绍一下如何使用Haploview进行单倍型的分析。 计划分为三篇文章: 第一篇:Haploview做单倍型教程1–软件安装第二篇:Haploview做单倍型教程2–分析教程第三篇:Haploview做单倍型教程…

java中对泛型的理解

那么什么是泛型泛型:是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,而这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型…

【ROS2 入门】ROS2 创建工作空间

大家好,我是虎哥,从今天开始,我将花一段时间,开始将自己从ROS1切换到ROS2,在上几篇中,我们一起了解ROS 2中很多基础概念,从今天开始我们逐步就开始利用ROS2的特性进行开发编程了。 工作区&#…

【Linux】基础IO --- 系统级文件接口、文件描述符表、文件控制块、fd分配规则、重定向…

能一个人走的路别抱有任何期待,死不了 文章目录一、关于文件的重新认识二、语言和系统级的文件操作(语言和系统的联系)1.C语言文件操作接口(语言级别)1.1 文件的打开方式1.2 文件操作的相关函数1.3 细节问题2.系统级文…

【Go基础】加密算法和数据结构

文章目录一、加密算法1. 对称加密2. 非对称加密3. 哈希算法二、数据结构与算法1. 链表2. 栈3. 堆4. Trie树一、加密算法 1. 对称加密 加密过程的每一步都是可逆的 加密和解密用的是同一组密钥 异或是最简单的对称加密算法 // XOR 异或运算,要求plain和key的长度相…

PHP实现URL长连接转短连接方法总结

依据第二种算法,URL长连接转短连接实现方法如下:语言:PHP5.6服务器环境:LNMP假设:长连接地址:http://www.test.com/index.php短连接地址:http://t.test.com/六位code码第一步:利用sh…

Jupyter使用详解

Jupyter使用详解 本篇文章我们主要介绍Jupyter的使用与配置,本篇文章的主要内容如下: 什么是Jupyter notebookJupyter notebook的安装使用Jupyter notebook 什么是Jupyter notebook? Jupyter Notebook是一个Web应用程序,允许您…