动静态库的使用(Linux下)

news2025/6/7 7:57:30

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.o
	ar -rc $@ $^
%.o:%.c
	gcc -c $<

.PHONY:clean
clean:
	rm -f *.a *.o

.PHONY:output
output:
	mkdir mylibc
	mkdir -p mylibc/include
	mkdir -p mylibc/lib 
	cp *.h mylibc/include
	cp *.a mylibc/lib
	tar 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.o
	gcc -o $@ $^ -shared
%.o:%.c
	gcc -fPIC -c $<

.PHONY:clean
clean:
	rm -f *.a *.o

.PHONY:output
output:
	mkdir mylibc
	mkdir -p mylibc/include
	mkdir -p mylibc/lib 
	cp *.h mylibc/include
	cp *.so mylibc/lib
	tar czf mylibc.tgz mylibc

shared: 表示生成共享库格式

fPIC:产生位置无关码(position independent code)

一般情况下动态库文件使用.so后缀

3.2 动态库使用

这里动态库的使用和前面静态库的基本一致,三种情况是一样的,使用-I,-L选项是一样的。

但是这里有个很大的问题:

形成的可执行文件不能运行

这里通过ldd命令操作,查看该可执行文件所链接的动态库:

ldd a.out
    linux-vdso.so.1 => (0x00007fff4d396000)
    libmyc.so => not found
    libc.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:库文件路径

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

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

相关文章

PostgreSQL17 编译安装+相关问题解决

更新时间&#xff1a;2025.6.6&#xff0c;当前最新稳定版本17.5&#xff0c;演示的是17.5&#xff0c;最新测试版本18beta1 演示系统&#xff1a;debian12 很多时候&#xff0c;只有编译安装才能用上最新的软件版本或指定的版本。这也是编译安装的意义。 一、编译安装 &…

React 第五十六节 Router 中useSubmit的使用详解及注意事项

前言 useSubmit 是 React Router v6.4 引入的强大钩子&#xff0c;用于以编程方式提交表单数据。 它提供了对表单提交过程的精细控制&#xff0c;特别适合需要自定义提交行为或非标准表单场景的应用。 一、useSubmit 核心用途 编程式表单提交&#xff1a;不依赖 <form>…

华为云学堂-云原生开发者认证课程列表

华为云学堂-云原生认证 云原生开发者认证的前5个课程

理解网络协议

1.查看网络配置 : ipconfig 2. ip地址 : ipv4(4字节, 32bit), ipv6, 用来标识主机的网络地址 3.端口号(0~65535) : 用来标识主机上的某个进程, 1 ~ 1024 知名端口号, 如果是服务端的话需要提供一个特定的端口号, 客户端的话是随机分配一个端口号 4.协议 : 简单来说就是接收数据…

全球知名具身智能/AI机器人实验室介绍之AI FACTORY基于慕尼黑工业大学

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

DASCTF

[DASCTF X 0psu3十一月挑战赛&#xff5c;越艰巨越狂热]EzPenetration Tip:数据库里的邮箱key已更改为管理员密码&#xff0c;拿到后可直接登录 打开靶机&#xff0c;用Wappalyzer分析网站&#xff0c;可以看到管理系统是Wordpress&#xff0c;因此可以尝试用WPSSCAN扫描公开…

ModBus总线协议

一、知识点 1. 什么是Modbus协议&#xff1f; Modbus 是一种工业通信协议&#xff0c;最早由 Modicon 公司在1979年提出&#xff0c;目的是用于 PLC&#xff08;可编程逻辑控制器&#xff09;之间的数据通信。它是主从式通信&#xff0c;即一个主机&#xff08;主设备&#xf…

【计算机网络】非阻塞IO——poll实现多路转接

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;计算机网络 &#x1f339;往期回顾&#x1f339;&#xff1a;【计算机网络】非阻塞IO——select实现多路转接 &#x1f516;流水不争&#xff0c;争的是滔滔不息 一、…

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 …

智慧货运飞船多维度可视化管控系统

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

电脑开不了机,主板显示67码解决过程

文章目录 现象分析内存条问题BIOS设置问题其它问题 解决清理内存条金手指所需工具操作步骤注意事项 电脑在运行过程中&#xff0c;显示内存不足&#xff0c;重启电脑却无法启动。 现象 System Initialization 主板风扇是转的&#xff0c;也有灯光显示&#xff0c;插上屏幕&am…

自托管图书搜索引擎Bookologia

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

前端flex、grid布局

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

Maven相关问题:jna版本与ES冲突 + aop失效

文章目录 1、背景2、解决3、一点思考4、环境升级导致AOP失效5、okhttp Bean找不到6、总结 记录一些Maven依赖相关的思考 1、背景 做一个监控指标收集&#xff0c;用一下jna依赖&#xff1a; <dependency><groupId>net.java.dev.jna</groupId><artifact…

Tomcat全方位监控实施方案指南

#作者&#xff1a;程宏斌 文章目录 一&#xff0e;二进制部署1、安装包信息2、新建配置文件2.1 配置config.yaml文件2.2 上传jar包 3、修改配置3.1 备份3.2 修改bin目录下的startup.sh文件 4、重启tomcat5、访问测试 二&#xff0e;docker部署1、临时方案1.1、重新启动容器1.2…

To be or Not to be, That‘s a Token——论文阅读笔记——Beyond the 80/20 Rule和R2R

本周又在同一方向上刷到两篇文章&#xff0c;可以说&#xff0c;……同学们确实卷啊&#xff0c;要不卷卷开放场域的推理呢&#xff1f; 这两篇都在讲&#xff1a;如何巧妙的利用带有分支能力的token来提高推理性能或效率的。 第一篇叫 Beyond the 80/20 Rule: High-Entropy Mi…

《UE5_C++多人TPS完整教程》学习笔记37 ——《P38 变量复制(Variable Replication)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P38 变量复制&#xff08;Variable Replication&#xff09;》 的学习笔记&#xff0c;该系列教学视频为计算机工程师、程序员、游戏开发者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09…

AWS API Gateway配置日志

问题 访问API Gateway接口出现了403问题&#xff0c;具体报错如下&#xff1a; {"message":"Missing Authentication Token"}需要配置AWS API Gateway日志&#xff0c;看请求过程是什么样子的。 API Gateway 先找到API Gateway的的日志角色&#xff0c…

Towards Open World Object Detection概述(论文)

论文&#xff1a;https://arxiv.org/abs/2103.02603 代码&#xff1a;https://github.com/JosephKJ/OWOD Towards Open World Object Detection 迈向开放世界目标检测 Abstract 摘要 Humans have a natural instinct to identify unknown object instances in their environ…

轻松备份和恢复 Android 系统 | 4 种解决方案

我们通常会在 Android 手机上存储大量重要的个人数据&#xff0c;包括照片、视频、联系人、信息等等。如果您不想丢失宝贵的数据&#xff0c;可以备份 Android 数据。当您需要访问和使用这些数据时&#xff0c;可以将其恢复到 Android 设备。如果您想了解 Android 备份和恢复&a…