Linux生成动态库

news2024/10/7 4:34:37

动态库

1.命名规则

Linux: libxxx.so

  • lib :前缀(固定的);
  • xxx:动态库的名字(自己取);
  • .so:后缀(固定的);

Windows:libxxx.dll

2.动态库的制作

  1. 使用 gcc 得到 .o文件 , 得到和位置无关的代码
gcc -c -fpic a.c b.c ...
  1. 使用 gcc 得到动态库:
gcc -shared a.o b.o ... -o libxxx.so

3.示例

我们先新建如下结构的 demo :

在这里插入图片描述

以上代码在博客 : Linux生成静态库

1.使用 gcc 得到 .o文件 , 得到和位置无关的代码

在这里插入图片描述
此时报错显示 找不到 head.h。是因为我们没有指定头文件的路径,在命令后加上 -I ../include/ 就可以了。

在这里插入图片描述

2. 使用 gcc 得到动态库

在这里插入图片描述
将生成的动态库文件 libcal.so 移动到 lib/ 目录下。

在这里插入图片描述

3.生成可执行程序 app 并执行

在这里插入图片描述
当我们生成可执行文件 app 并执行后,报错了。

它显示找不到这个动态库。

执行失败的原因需要先了解 linux 加载动态库的流程和原理。

4.工作原理

  • 静态库:gcc 在进行链接时,会把静态库中的代码打包到可执行文件中;
  • 动态库:gcc在进行链接时,动态库的代码不会被打包到可执行文件中;

在程序启动之后,动态库会被动态加载到内存中,通过 ldd (list dynamic dependencies)命令检查动态库的依赖关系。

那么我们要如何定位共享文件呢?

当系统加载可执行文件的时候,能够知道其所依赖库的名字,但是还要知道这个库的绝对路径。此时就需要系统动态的载入器来获取该库的绝对路径。

对于 elf 格式的可执行文件,是由 ld-linux.so 来完成的。它先后搜索 elf 文件的 DT_RPATH 再到 环境变量LD_LIBRAR_PATH 再到 /etc/ld.so.cache文件列表 再到 /lib/ , /usr/lib 目录,找到库文件之后将其加载到内存中。

针对示例代码中的报错,我们先用 ldd 检测依赖关系:

在这里插入图片描述
我们发现系统显示 找不到 libcal.so 文件。

由于 DT_RPATH 一般是不能改动的,所以我们可以先修改环境变量 LD_LIBRARY_PATH

我们先获得动态库libcal.so 的绝对路径。

在这里插入图片描述

1.修改环境变量 LD_LIBRARY_PATH ,指对当前终端有效

在这里插入图片描述
此时添加了环境变量之后,app 就可以正常执行了。不过这个设置只对当前终端有效,是临时性的。

我关闭这个终端,再新开一个终端,之前的设置都无效了。

在这里插入图片描述

2.修改环境变量 LD_LIBRARY_PATH ,用户级别

修改用户家目录下的 .bashrc 文件,即 ~/.bashrc ,添加上这一句命令 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库文件的绝对路径

在这里插入图片描述

之后再刷新 .bashrc 文件。

source .bashrc

再执行。

在这里插入图片描述
此时再新开一个终端也没问题。

在这里插入图片描述

3.修改环境变量 LD_LIBRARY_PATH ,系统级别

在系统配置 /etc/profile 里面添加上那个命令 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库文件的绝对路径

在这里插入图片描述
保存退出之后,刷新并执行。

在这里插入图片描述

4.修改 /etc/ld.so.cache 文件

由于 /etc/ld.so.cache 是一个二进制文件,无法修改。

我们可以通过修改 /etc/ld.so.conf 来达到间接修改的目的,我们直接将 libcal.so 的绝对路径添加到 /etc/ld.so.conf 即可。

在这里插入图片描述

接着更新并执行,注意更新的命令是 ldconfig

在这里插入图片描述

5.静态库和动态库

静态库 和 动态库的主要区别是 来自链接阶段如何处理、链接成可执行程序。分别称为静态链接方式动态链接方式

1.静态库的制作过程

在这里插入图片描述

2.动态库的制作流程

在这里插入图片描述

3.静态库与动态库的区别

静态库

优点:

  • 静态库被打包到应用程序中加载速度比较快;
  • 发布程序的时候不需要提供静态库,移植方便;

缺点:

  • 更消耗系统资源,浪费内存,可执行文件体积过于臃肿;
  • 更新、部署、发布非常麻烦;
动态库

优点:

  • 可以进行进程间资源共享(共享库);
  • 更新、部署、发布更为简单;
  • 可以人为的控制何时加载动态库;

缺点:

  • 加载到内存的速度比不上静态库被打包到程序中;
  • 在发布程序时需要提供依赖的动态库;

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

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

相关文章

.NET Framework中自带的泛型委托Action

Action<>是.NET Framework中自带的泛型委托&#xff0c;可以接收一个或多个输入参数&#xff0c;但不返回任何参数&#xff0c;可传递至多16种不同类型的参数类型。在Linq的一些方法上使用的比较多。 1、Action泛型委托 .NET Framework为我们提供了多达16个参数的Action…

链表面试OJ题(1)

今天讲解两道链表OJ题目。 1.链表的中间节点 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个…

轻量封装WebGPU渲染系统示例<19>- 使用GPU Compute材质多pass元胞自动机(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/GameOfLifeMultiMaterialPass.ts 系统特性: 1. 用户态与系统态隔离。 细节请见&#xff1a;引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调…

1200*D. Same Differences(数学推公式)

Problem - 1520D - Codeforces 解析&#xff1a; 统计 a [ i ] - i #include<bits/stdc.h> using namespace std; #define int long long const int N2e55; int t,n,a[N]; signed main(){scanf("%lld",&t);while(t--){scanf("%lld",&n);…

一些对程序员有用的网站

当你遇到问题时 Stack Overflow&#xff1a;订阅他们的每周新闻和任何你感兴趣的主题Google&#xff1a;全球最大搜索引擎必应&#xff1a;在你无法使用Google的时候CSDN&#xff1a;聊胜于无AI导航一号AI导航二号 新闻篇 OSCHINA&#xff1a;中文开源技术交流社区 针对初学…

FPGA设计过程中有关数据之间的并串转化

1.原理 并串转化是指的是完成串行传输和并行传输两种传输方式之间的转换的技术&#xff0c;通过移位寄存器可以实现串并转换。 串转并&#xff0c;将数据移位保存在寄存器中&#xff0c;再将寄存器的数值同时输出&#xff1b; 并转串&#xff0c;将数据先进行移位&#xff0…

RHCSA --- Linux系统文件操作

rm -rf * 删除当前目录下的所有文件及目录&#xff0c;并且是直接删除&#xff0c;无需逐一确认命令行为 touch&#xff1a; 不存在时创建&#xff0c;存在时更新文件时间戳 touch 1 2 3 4 创建多个文件 touch {1..4}{2..4} 花括号展开创…

STM32_project:led_beep

代码&#xff1a; 主要部分&#xff1a; #include "stm32f10x.h" // Device header #include "delay.h"// 给蜂鸣器IO口输出低电平&#xff0c;响&#xff0c;高&#xff0c;不向。 //int main (void) //{ // // 开启时钟 // RC…

开关电源怎么进行老化测试?有哪些测试方法?

一、开关电源老化测试原理 开关电源老化测试是检测电源长期稳定性和可靠性的重要测试方法。通过模拟开关电源在实际工作环境(如高负荷、高温等)中的长时间使用&#xff0c;来验证其性能、稳定性和可靠性。老化测试的原理主要基于以下概念&#xff1a; 1. 加速老化原理 老化测试…

Ntrip协议是什么?(RTK)

NTRIP (Networked Transport of RTCM via Internet Protocol) 是一种将实时差分导航数据通过互联网传输的协议。它被广泛应用于全球卫星定位系统 (GNSS) 定位和导航领域&#xff0c;以提高 GNSS 定位的精度。 NTRIP 是基于 TCP/IP 的协议&#xff0c;使用 HTTP/1.1 进行数据传…

vue中异步更新$nextTick

1.需求 编辑标题, 编辑框自动聚焦 点击编辑&#xff0c;显示编辑框让编辑框&#xff0c;立刻获取焦点 2.代码实现 <template><div class"app"><div v-if"isShowEdit"><input type"text" v-model"editValue"…

leetcode链表

这几天手的骨裂稍微好一点了&#xff0c;但是还是很疼&#xff0c;最近学校的课是真多&#xff0c;我都没时间做自己的事&#xff0c;但是好在今天下午是没有课的&#xff0c;我也终于可以做自己的事情了。 今天分享几道题目 移除链表元素 这道题我们将以两种方法开解决&…

linux内的循环

格式 while 【 条件判断 】 do 语句体 done 上图 第一次代码&#xff0c;输入语句在外面&#xff0c;结果输入完&#xff08;非hello&#xff09;程序不断循环&#xff0c;没办法&#xff0c;ctrlc给程序终止了&#xff0c;然后把用户输入的语句放到了循环体里面…

【数据结构初级(2)】单链表的基本操作和实现

文章目录 Ⅰ 概念及结构1. 单链表的概念2. 单链表的结构 Ⅱ 基本操作实现1. 定义单链表结点2. 创建新结点3. 单链表打印4. 单链表尾插5. 单链表头插6. 单链表尾删7. 单链表头删8. 单链表查找9. 在指定 pos 位置前插入结点10. 删除指定 pos 位置的结点11. 单链表销毁 本章实现的…

阿里云服务器优惠购买和搭建网站全流程(图文教程)

阿里云服务器使用教程包括云服务器购买、云服务器配置选择、云服务器开通端口号、搭建网站所需Web环境、安装网站程序、域名解析到云服务器公网IP地址&#xff0c;最后网站上线全流程&#xff0c;新手站长xinshouzhanzhang.com分享阿里云服务器详细使用教程&#xff1a; 一&am…

win11系统完全卸载Oracle11g图文详细步骤

完全卸载Oracle11g图文详细步骤 卸载步骤&#xff1a; 1.停用Oracle服务 2.卸载Oracle产品 3.删除注册表 4.删除环境变量 5.删除安装文件 6.重启电脑 文章目录 1. 停用Oracle服务2. 卸载Oracle产品3. 删除注册表4. 删除环境变量5. 删除安装文件6. 重启电脑扩展了解一下 Oracle相…

Requests 与接口请求构造

Requests 是一个优雅而简单的 Python HTTP 库&#xff0c;其实 Python 内置了用于访问网络的资源模块&#xff0c;比如urllib&#xff0c;但是它远不如 Requests 简单优雅&#xff0c;而且缺少了许多实用功能。所以&#xff0c;更推荐掌握 Requests 接口测试实战技能&#xff0…

oracle_19c 安装

oracle安装部署 1、安装docker,docker-compose环境。 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun curl -L "https://github.com/docker/compose/releases/download/1.14.0-rc2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/b…

springboot初始化

一、 SpringBean 1. Spring Bean 1) Bean定义 Bean是什么&#xff0c;Bean是特殊的对象&#xff0c;交由Spring管理的Java对象&#xff0c;这类对象在创建的时候会根据spring的一些注解&#xff0c;和IOC&#xff0c;属性如果使用Autowired的话&#xff0c;会自动赋值。Bean…

[AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]

场景 在使用Android Studio的虚拟设备运行App时&#xff0c;需要创建很大镜像文件。这些镜像文件一般都在系统盘&#xff0c;导致系统盘占用增大。怎么把这些镜像的存放路径设置在其他盘&#xff1f; 说明 虚拟设备的和它的镜像默认是放在用户目录\.android\avd位置。如果是在…