【Linux】库制作与原理(二):动态库的制作与使用
✨道路是曲折的前途是光明的 专注C/C、Linux编程与人工智能领域分享学习笔记 感谢各位小伙伴的长期陪伴与支持欢迎文末添加好友一起交流一、基础背景二、动态库的制作三、动态库的使用四、总结一、基础背景一些动静态库的基础知识和静态库的制作与使用的讲解请点击【Linux】库制作与原理一静态库的制作与使用二、动态库的制作我们静态库实现的是一个加法的使用我们动态库的演示就来一个减法和乘法吧我们需要用要的两个源文件sub.cmul.c两个头文件sub.hmul.h。#pragmaonceexternintmy_sub(intx,inty);#includesub.hintmy_sub(intx,inty){returnx-y;}#pragmaonceexternintmy_mul(intx,inty);#includemul.hintmy_mul(intx,inty){returnx*y;}其制作与静态库有些类似但是所用的选项和打包工具是不同的我们先看Makefile自动化构建里面的代码再来介绍一下不同之处。lib libmymath.so $(lib):sub.o mul.o gcc -shared -o $ $^ sub.o:sub.c gcc -fPIC -c $^ -o $ mul.o:mul.c gcc -fPIC -c $^ -o $ .PHONY:clean clean: rm -rf *.o *.so mylib .PHONY:output output:$(lib) mkdir -p mylib/include mkdir -p mylib/mathlib cp *.h mylib/include cp *.so mylib/mathlib具体的注释请看上一篇文章静态库的制作与使用这里我们只看不同点。我们这里看到gcc指令多了一个-fPIC这个是用来产生位置无关码形成动态库的时候-shared这个是专门用来形成.so后最的动态库文件指令执行我们自动化构建工具的指令我们先通过ls看一下权限.其实是因为动态库如 libmymethod.so的可执行权限x并非指其能被直接运行而是因为可执行程序本身具备可执行权限在运行时会跳转调用动态库中的函数逻辑因此动态库的 x 权限本质是为了支撑可执行程序对其函数的调用执行是一种 “间接的可执行能力”。注意静态库无需加载且无可执行权限x因为静态库在链接阶段会将所需函数代码直接拷贝到可执行程序中拷贝完成后静态库即完成使命其代码成为可执行程序的一部分最终运行时可执行程序直接在自身内存空间执行这些代码无需跳转至静态库因此静态库既无需加载也不需要可执行权限x可执行程序也不再依赖静态库。三、动态库的使用我们此时站在用户的角度使用我们制作的动态库首先要准备好自己的测试文件test.c下面再写然后把我们提供的动态库目录mylib移动到测试目录下以此模拟用户下载并存放库文件的操作。#includestdio.h#includesub.h#includemul.hintmain(){inta20;intb10;intcmy_sub(a,b);intdmy_mul(a,b);printf(a - b %d\n,c);printf(a * b %d\n,d);return0;}和静态库一样我们这里gcc时候直接带上-I,-L,-l指令我们发现并没有静态库的使用那么简单当有了可执行程序文件我们执行的时候还是失败了它找不到我们的共享库即使这里我们告知了动态库所在的路径以及哪一个动态库这是为什么因为编译时指定路径 ≠ 运行时能找到库这也是动态库比静态库复杂的根本原因。编译链接阶段和运行加载阶段是完全独立的两个过程编译器的工作只到 “生成可执行程序a.out/test” 为止它不会把 “动态库的路径” 写入可执行程序中。那么该如何解决这种问题法一把动态库拷贝到系统目录下sudo libmymath.so /usr/local/libsudo ldconfig此时我们我们在运行./a.out我们先删除一下上面拷贝到系统下的库,然后同样的刷新缓存一下发现又找不到了说明删除成功sudo rm /usr/local/lib/libmymath.so法二在系统默认路径下建立软链接这里建议使用绝对路径避免成为无效链接。sudo ln -s /home/dh/study/2-4/libmymath.so /usr/local/lib/libmymathsudo unlink /usr/local/lib/libmymath.so直接删除我们的软链接法三更改LD_LIBRARY_PATH,也就是把自己库所在的路径添加到环境变量里边export LD_LIBRARY_PATH$LD_LIBRARY_PATH:XXXXX这个export命令是临时生效的 —— 关闭当前终端、重启电脑或新开终端后LD_LIBRARY_PATH会变回空。法四配置/etc/ld.so.conf.d在这个路径下新建自己的动态库路径配置文件然后刷新缓存删除的话只要我们缺到在上面的路径下直接执行rm即可四、总结本文详细介绍了Linux下动态库以libmymath.so为例的制作与使用制作时需准备功能源文件sub.c/mul.c和头文件sub.h/mul.h通过gcc -fPIC生成位置无关码、-shared打包为动态库并用Makefile自动化构建整理文件。使用时需用-I/-L/-l指定头文件和库路径但动态库编译时指定路径不等于运行时能找到核心原因是编译与运行阶段相互独立。需通过“拷贝库到系统目录刷新缓存”“建立软链接”“设置LD_LIBRARY_PATH环境变量”“配置/etc/ld.so.conf.d目录”四种方法解决。相比静态库动态库需依赖外部文件、有间接可执行权限、可共享节省空间且更新方便而静态库链接后无依赖、无x权限两者各有优劣实操中需根据需求选择合适方式。

相关新闻

Spring Cloud 服务接入到 Apache ShenYu 网关完整案例

Spring Cloud 服务接入到 Apache ShenYu 网关完整案例

Spring Cloud快速开始 本文档演示如何将Spring Cloud服务接入到Apache ShenYu网关。您可以直接在工程下找到本文档的示例代码 。 环境准备 请参考运维部署的内容,选择一种方式启动shenyu-admin。比如,通过 本地部署 启动Apache ShenYu后台管理系统。 …

2026/7/6 10:48:27 阅读更多 →
selenium 自动化测试工具实战项目(窗口切换)

selenium 自动化测试工具实战项目(窗口切换)

介绍 测试的系统:白月黑羽网站的测试系统(白月SMS系统) 测试内容:点击【学习教程】链接跳转到白月黑羽网站,获取此网站上的标题,然后回到原来的系统。 所涉及的知识点:frame切换/窗口切换 这个iframe元素非常的特殊&…

2026/7/4 20:02:24 阅读更多 →
学霸同款 9个AI论文写作软件测评:本科生毕业论文+开题报告高效工具推荐

学霸同款 9个AI论文写作软件测评:本科生毕业论文+开题报告高效工具推荐

在当前学术研究日益精细化、AI技术快速发展的背景下,本科生在撰写毕业论文和开题报告时,常常面临内容组织混乱、文献资料查找困难、格式规范不熟悉等多重挑战。为帮助学生更高效地完成学术写作任务,笔者基于2026年的实测数据与用户反馈&#…

2026/6/24 20:11:46 阅读更多 →

最新新闻

Excel ROUND函数底层原理与财务工程级避坑指南

Excel ROUND函数底层原理与财务工程级避坑指南

1. 项目概述:为什么一个“四舍五入”函数值得写上万字?Excel里敲下ROUND(A1,2),结果立刻出来——看起来简单得不能再简单。但如果你在财务报表里用它算过增值税、在工程预算中处理过材料损耗率、在科研数据里校验过有效数字,你大概…

2026/7/6 10:46:37 阅读更多 →
Plone电商基建加固:GetPaid Recipe Release 1.4.1深度解析

Plone电商基建加固:GetPaid Recipe Release 1.4.1深度解析

1. 项目概述:一个被低估的 Plone 电商基建工具包更新 Plone 是个老派但极其扎实的内容管理系统,尤其在政府、教育、科研类机构里扎根很深。它不像 WordPress 那样靠主题和插件堆出花哨界面,而是靠严格的权限模型、内容生命周期管理和可审计性…

2026/7/6 10:46:37 阅读更多 →
ZODB对象数据库原理与Zope内容管理实战

ZODB对象数据库原理与Zope内容管理实战

1. 项目概述:当应用服务器与数据库在对象层面“无缝焊接”我第一次接触 Zope 是在 1998 年,那会儿连“Web 应用框架”这个词都还没被广泛使用。打开文档,第一反应不是兴奋,而是皱眉——“这玩意儿默认不让我连 MySQL?”…

2026/7/6 10:46:37 阅读更多 →
Linux防火墙端口管理:firewalld、iptables、ufw 3种方案深度对比与选择指南

Linux防火墙端口管理:firewalld、iptables、ufw 3种方案深度对比与选择指南

Linux防火墙端口管理:firewalld、iptables、ufw 3种方案深度对比与选择指南在Linux服务器管理中,防火墙配置是确保系统安全的关键环节。面对不同的发行版和业务需求,系统管理员常常需要在firewalld、iptables和ufw这三种主流防火墙工具之间做…

2026/7/6 10:44:32 阅读更多 →
可视化指挥闭环:城市安防视频孪生时空感知技术详解

可视化指挥闭环:城市安防视频孪生时空感知技术详解

可视化指挥闭环:城市安防视频孪生时空感知技术详解摘要传统城市安防指挥体系存在视频孤岛、时空基准割裂、预警处置脱节、调度无空间量化支撑、事后复盘证据碎片化五大核心痛点,指挥链路停留在“看画面、接警情、人工派单”的线性被动模式,无…

2026/7/6 10:44:32 阅读更多 →
如何快速上手eulerfs-test:从配置到执行的完整教程

如何快速上手eulerfs-test:从配置到执行的完整教程

如何快速上手eulerfs-test:从配置到执行的完整教程 【免费下载链接】eulerfs-test test scripts for eulerfs 项目地址: https://gitcode.com/openeuler/eulerfs-test 前往项目官网免费下载:https://ar.openeuler.org/ar/ eulerfs-test是openEul…

2026/7/6 10:42:30 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻