动静态库的使用(Linux下)
1.库
通俗来说,库就是现有的,可复用的代码,例如:在C/C++语言编译时,就需要依赖相关的C/C++标准库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。通常我们可以在windows下看到一些后缀为.dll,.lib等就是库文件。
静态库:.a[Linux]、.lib[windows]
动态库:.so[Linux]、.dll[windows]
2. 静态库
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候将不再
需要静态库。
注意:一个可执行程序可能用到许多的库,这些库运行有的是静态库,有的是动态库,而我们的编译默认为动态链接库,只有在该库下找不到动态.so的时候才会采用同名静态库。(因为动态库,更节省空间,后面有详细讲解)
2.1 生成静态库
这里首先要介绍一个工具(命令)
ar -rc $@ $^
@:归档的目标文件,^:归档的.o文件
rc 表示 (replace and create)
这里Makefile文件来举例:
libmyc.a:mystdio.o mymath.oar -rc $@ $^
%.o:%.cgcc -c $<.PHONY:clean
clean:rm -f *.a *.o.PHONY:output
output:mkdir mylibcmkdir -p mylibc/includemkdir -p mylibc/lib cp *.h mylibc/includecp *.a mylibc/libtar czf mylibc.tgz mylibc
这里就是将写的mysdio.c 和mymath.c文件打包成静态库,并且压缩。
2.2 静态库使用
这里直接在编译代码时包含上述头文件,是不能直接使用的,如:
#include "mystdio.h"
#include "mymath.h"
这里有三种情况:
情况一:头文件和库文件和我们自己的源文件在同一个路径下时
只需要-L选项即可:
gcc main.c -L. -lmyc
-L:表示当前路径下寻找库文件;
-lmyc:使用时是在库文件(即libmyc.a)前面加-l,并且去掉后缀.a。
情况二:头文件和库文件有自己的独立路径
gcc main.c -I头文件路径 -L库文件路径 -lmyc
-I: 指定头文件搜索路径;
情况三::头文件和库文件安装到系统路径下
这里要讲一下如何将库文件和头文件安装在系统路径下:
mv libmyc.a /lib64/#库文件放到/lib64/路径下mv *.h /usr/include/#头文件放到/usr/include/路径下
将上述文件配置好后,就可以直接指定需要使用的库文件(不需要带-),就可以形成可执行程序了。
gcc main.c -lmyc
3. 动态库
动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采
用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空
间。
一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表(got),而不是动态库所在目标文件的整个机器码(二进制文件)
在可执行文件开始运行以前,动态库的机器码(二进制文件)由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(后两点在后面有讲解)
3.1 动态库生成
libmyc.so:mystdio.o mymath.ogcc -o $@ $^ -shared
%.o:%.cgcc -fPIC -c $<.PHONY:clean
clean:rm -f *.a *.o.PHONY:output
output:mkdir mylibcmkdir -p mylibc/includemkdir -p mylibc/lib cp *.h mylibc/includecp *.so mylibc/libtar czf mylibc.tgz mylibc
shared: 表示生成共享库格式
fPIC:产生位置无关码(position independent code)
一般情况下动态库文件使用.so后缀
3.2 动态库使用
这里动态库的使用和前面静态库的基本一致,三种情况是一样的,使用-I,-L选项是一样的。
但是这里有个很大的问题:
形成的可执行文件不能运行
这里通过ldd命令操作,查看该可执行文件所链接的动态库:
ldd a.outlinux-vdso.so.1 => (0x00007fff4d396000)libmyc.so => not foundlibc.so.6 => /lib64/libc.so.6 (0x00007fa2aef30000)/lib64/ld-linux-x86-64.so.2 (0x00007fa2af2fe000)
可以看到并不能找到用户链接得动态库。
这里还要解释一下,为什么前面静态库没有这个问题,因为静态库链接时,会将全部库文件加载到可执行文件中,并不需要执行时去寻找链接得库,但是链接动态库,执行时就需要去寻找动态库。
3.2.1 解决方案
方案一:这里也可以通过之前的方法,将拷贝 .so 文件到系统共享库路径下, 一般指/lib64。
方案二:向系统共享库路径下建立同名软连接:
ln -s 路径 目标路径(/lib64/目标文件名)
方案三:导入环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库文件路径
相关文章:
动静态库的使用(Linux下)
1.库 通俗来说,库就是现有的,可复用的代码,例如:在C/C语言编译时,就需要依赖相关的C/C标准库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。通常我们可以在windows下看到一些后…...

PostgreSQL17 编译安装+相关问题解决
更新时间:2025.6.6,当前最新稳定版本17.5,演示的是17.5,最新测试版本18beta1 演示系统:debian12 很多时候,只有编译安装才能用上最新的软件版本或指定的版本。这也是编译安装的意义。 一、编译安装 &…...
FFMPEG 提取视频中指定起始时间及结束时间的视频,给出ffmpeg 命令
以下是提取视频中指定起始时间及结束时间的 ffmpeg 命令示例: bash 复制 ffmpeg -i input.mp4 -ss 00:01:30.00 -to 00:05:00.00 -c copy output.mp4 其中,-i input.mp4 是指定要处理的输入视频文件为 “input.mp4”。 -ss 00:01:30.00 表示指定视频的起始时间为 1 分 30 …...

React 第五十六节 Router 中useSubmit的使用详解及注意事项
前言 useSubmit 是 React Router v6.4 引入的强大钩子,用于以编程方式提交表单数据。 它提供了对表单提交过程的精细控制,特别适合需要自定义提交行为或非标准表单场景的应用。 一、useSubmit 核心用途 编程式表单提交:不依赖 <form>…...

华为云学堂-云原生开发者认证课程列表
华为云学堂-云原生认证 云原生开发者认证的前5个课程...
Vue.js 组件:深入理解与实践
Vue.js 组件:深入理解与实践 引言 随着前端技术的不断发展,Vue.js 作为一种流行的前端框架,因其简洁、易学、高效的特点受到越来越多开发者的青睐。在Vue.js中,组件是构建用户界面的基石。本文将深入探讨Vue.js组件的概念、特性、创建方式以及在实际开发中的应用,帮助读…...
什么是强化学习:设置奖励函数最为loss, 监督学习:标签准确率作为loss
什么是强化学习:设置奖励函数最为loss, 监督学习:标签准确率作为loss 什么是强化学习:在复杂环境中自主探索,适用于序列决策 最大优势: 通过试错探索发现最优策略,适应环境动态变化,擅长解决需要长期规划和序列决策的问题。典型案例: 游戏AI(如AlphaGo/AlphaZero):…...

理解网络协议
1.查看网络配置 : ipconfig 2. ip地址 : ipv4(4字节, 32bit), ipv6, 用来标识主机的网络地址 3.端口号(0~65535) : 用来标识主机上的某个进程, 1 ~ 1024 知名端口号, 如果是服务端的话需要提供一个特定的端口号, 客户端的话是随机分配一个端口号 4.协议 : 简单来说就是接收数据…...
placeholder不显示and模板字符串无效
一、placeholder"请输入"不显示请输入? input框里写了placeholder为什么不显示呢? 检查代码,input是否有初始值 在 Vue.js 中,v-model 是双向绑定的语法糖,它会动态更新输入框的 value。如果绑定的数据有初…...
在MyBatis中设计SQL返回布尔值(Boolean)有几种常见方法
方案一:使用COUNT查询存在性(推荐) <select id"checkUserExists" resultType"_boolean">SELECT COUNT(*) > 0 FROM users WHERE username #{username} </select> 说明: MySQL中COU…...

全球知名具身智能/AI机器人实验室介绍之AI FACTORY基于慕尼黑工业大学
全球知名具身智能/AI机器人实验室介绍之AI FACTORY基于慕尼黑工业大学 TUM AI FACTORY,即KI.FABRIK,是德国慕尼黑工业大学(TUM)在巴伐利亚州推出的一个旗舰项目,旨在打造未来工厂,将传统工厂转变为由人工智…...

DASCTF
[DASCTF X 0psu3十一月挑战赛|越艰巨越狂热]EzPenetration Tip:数据库里的邮箱key已更改为管理员密码,拿到后可直接登录 打开靶机,用Wappalyzer分析网站,可以看到管理系统是Wordpress,因此可以尝试用WPSSCAN扫描公开…...
钉钉 - 机器人消息推送(签名版)
前言 在日常生活中,我们可能会遇到某些异常发生后需要紧急通知到群里,让相关人员看到紧急处理的事件触发机制。 消息群我采用的是钉钉推送,本文介绍了如何用php 推送钉钉机器人消息。 源码封装 <?php /*** 钉钉通知 - 签名版*/ class …...
Redux 实践与中间件应用
Redux 异步处理的挑战 Redux 核心设计是同步的、单向数据流,但现代应用中异步操作无处不在。Redux 中间件填补了这一缺口,专门解决异步流程管理、副作用隔离等复杂场景。 中间件架构原理 中间件位于 action 被发起之后、到达 reducer 之前,…...

ModBus总线协议
一、知识点 1. 什么是Modbus协议? Modbus 是一种工业通信协议,最早由 Modicon 公司在1979年提出,目的是用于 PLC(可编程逻辑控制器)之间的数据通信。它是主从式通信,即一个主机(主设备…...

【计算机网络】非阻塞IO——poll实现多路转接
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:计算机网络 🌹往期回顾🌹:【计算机网络】非阻塞IO——select实现多路转接 🔖流水不争,争的是滔滔不息 一、…...
在.NET Core控制器中获取AJAX传递的Body参数
.Net Core是支持前后端不分离式的开发的,如果在原始系统中采用不分离式开发,后面需要在原系统中增加功能,并且新的服务采用其他语言开发,且系统原来功能保持原样,这样前端系统可以单独调用新开发的接口。 但是&#x…...
snprintf函数用法及注意事项详解
当 format 后没有可变参数(即 ... 为空)时,va_start 的行为和后续操作如下: 1. va_start 的行为 va_start 的核心任务是根据最后一个固定参数(format)的地址,计算可变参数列表的起始位置。即使…...
vue-20(Vuex 状态管理的最佳实践)
Vuex 状态管理的最佳实践 Vuex 是管理大型 Vue.js 应用状态的一个强大工具,但其有效性取决于其组织和维护的质量。管理不善的 Vuex 存储可能会变得难以控制、难以调试,并成为性能瓶颈。本课程深入探讨构建 Vuex 存储的最佳实践,重点关注可维…...

DAX权威指南8:DAX引擎与存储优化
文章目录 十七、DAX引擎17.1 DAX 引擎的体系结构17.1.1 表格模型的双引擎架构17.1.2 存储引擎的三种模式17.1.2.1 VertiPaq引擎17.1.2.2 DirectQuery 引擎17.1.2.3 对比与最佳实践 17.1.3 数据刷新 17.2 理解 VertiPaq 存储引擎17.2.1 列式数据库17.2.2 VertiPaq 压缩17.2.2.1 …...

智慧货运飞船多维度可视化管控系统
图扑搭建智慧货运飞船可视化系统,借数字孪生技术,高精度复刻货运飞船外观、结构与运行场景。整合多维度数据,实时呈现飞行状态、设备参数等信息,助力直观洞察货运飞船运行逻辑,为航天运维、任务推演及决策提供数字化支…...

电脑开不了机,主板显示67码解决过程
文章目录 现象分析内存条问题BIOS设置问题其它问题 解决清理内存条金手指所需工具操作步骤注意事项 电脑在运行过程中,显示内存不足,重启电脑却无法启动。 现象 System Initialization 主板风扇是转的,也有灯光显示,插上屏幕&am…...
Spring Boot 类加载机制深度解析
Spring Boot 类加载机制深度解析 前言 在 Java 应用开发中,类加载机制是一个重要且复杂的话题。Spring Boot 作为现代 Java 开发的主流框架,其类加载机制更是值得深入了解。本文将从基础概念到实际应用,全面解析 Spring Boot 的类加载机制。…...
Python 训练营打卡 Day 45
TensorBoard 简单来说,TensorBoard 是 TensorFlow 自带的一个「可视化工具」,就像给机器学习模型训练过程装了一个「监控屏幕」。你可以用它直观看到训练过程中的数据变化(比如损失值、准确率)、模型结构、数据分布等,…...

自托管图书搜索引擎Bookologia
简介 什么是 Bookologia ? Bookologia 是一个专门的书籍搜索引擎,可以在几秒钟内找到任何书籍。它是开源的,可以轻松自托管在 Docker 上,为用户提供一个简单而高效的书籍查找体验。 主要特点 简洁的用户界面:界面设计…...

前端flex、grid布局
flex布局 弹性布局是指通过调整其内元素的宽高,从而在任何的显示设备上实现对可用显示空间最佳填充的能力。弹性容器扩展其内元素来填充可用空间,或将其收缩来避免溢出 简单来说,弹性盒子模型,是为了你的网页可以在不同分辨率设…...

Maven相关问题:jna版本与ES冲突 + aop失效
文章目录 1、背景2、解决3、一点思考4、环境升级导致AOP失效5、okhttp Bean找不到6、总结 记录一些Maven依赖相关的思考 1、背景 做一个监控指标收集,用一下jna依赖: <dependency><groupId>net.java.dev.jna</groupId><artifact…...

Tomcat全方位监控实施方案指南
#作者:程宏斌 文章目录 一.二进制部署1、安装包信息2、新建配置文件2.1 配置config.yaml文件2.2 上传jar包 3、修改配置3.1 备份3.2 修改bin目录下的startup.sh文件 4、重启tomcat5、访问测试 二.docker部署1、临时方案1.1、重新启动容器1.2…...
开源PHP在线客服系统源码搭建教程
在当今数字化时代,在线客服系统已成为企业与客户沟通的重要桥梁。开源PHP客服系统因其灵活性、低成本和高可定制性而受到众多企业的青睐。本文将介绍几款优秀的开源PHP客服系统,并提供详细的搭建教程。 演示网站:gofly.v1kf.com 1.1 主流开源…...
centos7升级glibic-2.28
centos7升级glibic-2.28 最近使用trae连接服务器的时候,提示远程系统不兼容: Trae CN需要glibc 2.28或更高版本。检测到的版本: 2.17。下面是升级步骤。centos7默认的glibc不支持node v18及以上。 1、进入/home/download目录(没有download,则新建一个)…...