Linux动态库静态库总结

Linux动态库与静态库 基于著名书籍和自我学习得出的Linux动态库与静态库精华知识 阅读详情

静态库生成
g++ -c mylib.cpp -o mylib.o
ar rcs libmylib.a mylib.o

动态库生成
g++ -fPIC -shared mylib.cpp -o libmylib.so
-fPIC:生成位置无关代码(Position-Independent Code),对动态库必需。

库文件使用:
静态库:/home/user/libs/libmath.a
静态链接 g++ main.cpp -o app_static -L/home/user/libs -lmath

动态库:/home/user/libs/libmath.so
动态链接 g++ main.cpp -o app_shared -L/home/user/libs -lmath
# 运行前设置动态库路径
export LD_LIBRARY_PATH=/home/user/libs:$LD_LIBRARY_PATH
./app_shared

如果同时存在同名静态库(.a)和动态库(.so),链接器会优先选择动态库(除非显式指定使用静态库)。
例如:当使用 -lmylib 时,链接器会优先查找 libmylib.so,若未找到,再查找 libmylib.a。
若需强制链接静态库
g++ main.cpp -o app -L/path/to/libs -l:mylib.a   # 显式指定静态库文件名
# 或
g++ main.cpp -o app /path/to/libs/libmylib.a     # 直接指定静态库路径
也可通过 -static 强制所有库静态链接
g++ main.cpp -o app -static -L/path/to/libs -lmylib

链接器通过文件名后缀判断库类型:
静态库:后缀为 .a(Archive),例如 libmylib.a。
动态库:后缀为 .so(Shared Object),例如 libmylib.so
如果文件后缀错误(例如将动态库命名为 .a),链接器会尝试将其当作静态库解析,最终因格式不匹配而报错

可以混合链接
g++ main.cpp -o app \
    -Wl,-Bstatic -lstatic_lib1 -lstatic_lib2 \  # 强制静态链接
    -Wl,-Bdynamic -lshared_lib1 -lshared_lib2   # 切回动态链接(默认)

-Wl,<option>:将逗号后的内容传递给链接器(如 ld)。
-Bstatic:后续的 -l 库强制静态链接。
-Bdynamic:后续的 -l 库恢复动态链接(默认行为)。

假设程序依赖以下库:
libfoo.a(需静态链接)
libbar.so(需动态链接)
系统库 libm.so(动态链接)
g++ main.cpp -o app \
    -Wl,-Bstatic -lfoo \    # 静态链接 libfoo.a
    -Wl,-Bdynamic -lbar \   # 动态链接 libbar.so
    -lm                     # 动态链接 libm.so(默认)

如果库文件不在标准路径,可以显式指定路径和文件名:
g++ main.cpp -o app \
    /path/to/libfoo.a \         # 直接静态链接 libfoo.a
    -L/path/to/shared -lbar     # 动态链接 libbar.so

注意事项
1 链接器按从左到右的顺序解析依赖。如果库 A 依赖库 B,则 A 需要放在 B 的左边。例如:
g++ main.cpp -lA -lB  # A 依赖 B,正确顺序

2 静态库可能内部依赖其他动态库。若静态库在编译时未正确链接其依赖,可能导致运行时错误。需确保所有依赖都被显式链接。

3 动态链接的库需在运行时能被找到。可通过以下方式指定路径:
export LD_LIBRARY_PATH=/path/to/shared_libs:$LD_LIBRARY_PATH
./app

4 符号冲突
如果静态库和动态库中存在同名符号,链接器可能优先使用静态库中的符号,导致意外行为。需确保库之间的兼容性。

5 某些系统库(如 glibc)通常不建议静态链接,可能导致兼容性问题。
命令最后使用静态库链接时,应当在命令行最后使用动态连接的命令才能正常链接
如:gcc main.cpp -L. -Wl,-Bdynamic -lmydynlib -Wl,-Bstatic -lmystclib  -Wl,-Bdynamic 
使用pthread库要在命令最后加上 –lpthread

动态库的搜索路径搜索的先后顺序是:

1.编译时指定
2.LD_LIBRARY_PATH指定
3./etc/ld.so.conf指定
4./lib
5./usr/lib
 

[华为ensp]双核心的园区网 (给部分只会emm......借鉴的朋友提个醒,在group-member e0/0/2 to e0/0/20是所选,所以到了p l t那会给2-20端口都配置上trunk,别紧张,不是你问题)完成上述配置后,PC1可以ping通HTTP2服务器,Client1可以访问HTTP2服务器的HTTP站点,如果不能就要检查上述是否正确。本次实验主要目的是采用双核心的冗余网络,采用MSTP和VRRP技术,在核心层交换机上配置SC1上配置OSPF协议。SC1交换机上配置VRRP。在SC1上配置DHCP。 阅读详情

相关推荐

VisionMaster图像源模块的5个隐藏功能:从自动切换到二次开发接口

本文深入解析了VisionMaster图像源模块的5个隐藏功能,从基础的自动切换与字符触发过滤,到高级的脚本扩展与基于COM组件的二次开发接口。这些功能能显著提升工业视觉项目的自动化水平、灵活性与系统集成能力,帮助开发者实现更高效的离线测试流水线和外部精确控制。

rgv23456789的博客 652

【Linux】静态库和动态库

介绍动静态库、制作动静态库以及使用动静态库,基于地址空间理解动态库加载和程序运行的过程!

YoungMLet的博客 4091

Arduino程序设计(十)8×8 共阴极LED点阵显示(MAX7219)

本文主要介绍8×8 LED点阵显示实验,分别是:1、介绍MAX7219点阵模块;2、点阵显示部分图形;3、点阵显示数字 0~9 及 26 个英文字母。1、通过上述两个点阵实验,了解了8*8点阵显示的基本原理;2、通过SPI通信控制点阵显示,学会了Arduino用SPI通信方式控制外设。

Alice的博客 1万+

【Linux】动态库、静态库

动态库与静态库相关内容

weixin_69380220的博客 1666

深入解析luckyExcel处理xlsx与xls文件的实战技巧

本文深入解析了使用luckyExcel库在前端处理.xlsx与.xls文件的实战技巧。针对.xlsx文件,可直接调用API转换;对于老旧的.xls格式,则需结合SheetJS进行预处理。文章详细介绍了核心API的使用、两种格式的处理流程、数据提取方法以及性能优化建议,为开发在线Excel编辑应用提供了完整解决方案。

cherry的博客 818

智慧加油站小程序数据库设计文档

【代码】智慧加油站小程序数据库设计文档。

低代码布道师的博客 1403

Linux —— 动态库和静态库

详细演示了动静态的库的制作和使用

M的博客 6002

AI Agent驱动的多模态情感分析方法:从BERT到Vision Transformer的探索

情感分析(Sentiment Analysis)是自然语言处理(NLP)与计算机视觉(CV)中一项重要任务。传统的情感分析主要依赖于文本数据,但在现实应用中,情感往往通过 语言、语音、表情、姿态 等多模态信号共同传达。因此,结合 多模态深度学习 的 AI Agent 在情感理解中具有广阔的前景。

一键难忘的博客 738

Linux静态库和动态库

​动态链接库是程序运行时加载的库,当动态链接库正确部署之后,运行的多个程序可以使用同一个加载到内存中的动态库,因此在Linux中动态链接库也可称之为共享库。​动态链接库是目标文件的集合目标文件在动态链接库中的组织方式是按照特殊方式形成的。库中函数和变量的地址使用的是相对地址静态库中使用的是绝对地址),其真实地址是在应用程序加载动态库时形成的。NOTE]静态库跟动态库的核心区别是什么呢?静态库使用绝对地址,动态库使用相对地址?关于动态库的命名规则在Linux中,动态库以lib作为前缀,以.so。

踏上取经路,比抵达灵山更重要🐱‍👤 1453

用Python爬取大连商品交易所期货实时行情:从入门到实战

python复制编辑# utils.py"豆粕": "M0","铁矿石": "I0","聚乙烯": "L0","玉米": "C0","聚丙烯": "PP0","棕榈油": "P0"本项目展示了:✅ 如何从新浪财经 API获取主力合约实时数据✅ 使用Python异步爬虫技术) 提升效率✅ 利用pandas和matplotlib进行结构化分析与可视化✅ 具备良好的扩展性,可对接金融、农业、能源等数据需求场景✅ 可作为期货量化策略数据源✅ 可嵌入自动化报告系统。

2201_76125261的博客 1247

基于STM32F4XX 、HAL库的SHT40-CD1B-R3温湿度传感器驱动应用C语言程序设计

define SHT40_ADDR_READ 0x8B // CD1B 读地址 ((0x45 << 1) + 1)#define SHT40_ADDR_WRITE 0x8A // CD1B 写地址 (0x45 << 1)// 初始化 I2C1 (根据 CubeMX 生成的函数)// 湿度: -6%RH + 125%RH * (raw / 2^16)// 温度: -45°C + 175°C * (raw / 2^16)// 返回值: 0=成功, 1=失败(CRC错误或I2C通信错误)

PP_Cottage的博客 236

Linux——动态库和静态库

与静态库不同,动态库的代码不会被复制到每个程序中,而是在程序运行时从库文件中加载。这意味着当你链接一个静态库到你的程序时,库中的代码会被复制到最终的二进制文件里。在Linux中,链接过程分为两个阶段:编译(Compilation)和链接(Linking)。在实际开发中,开发者可能会根据项目的特点和部署环境来决定使用哪种类型的库。静态库和动态库各有优缺点,选择使用哪一种通常取决于具体的应用场景和需求。对于静态库,链接发生在编译阶段,而动态库的链接则发生在程序运行时。(动态链接器)能够找到并加载正确的库文件。

weixin_55582891的博客 1510

27、自闭症儿童治疗与玩具设计研究

本研究探讨了自闭症儿童的治疗方法与玩具设计之间的关联,分析了游戏疗法、音乐疗法和职业疗法等在治疗中的应用,并介绍了多种针对自闭症儿童的治疗玩具案例。通过用户研究和多学科合作,提出了以Pro-Ability为核心的设计理念,开发了结合音乐疗法和精细运动训练的智能玩具套件。研究总结了当前成果与局限性,并展望了未来发展方向,旨在为自闭症儿童提供更有效的康复支持。

keras9composer的博客 211

Linux静态库和动态库的实现

作者简介:大家好我是小唐同学(๑>؂

&volume的博客 2079

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Linux静态库和动态库区别

<br /><br />  我们通常把一些公用函数制作成函数库,供其它程序使用。<br /> <br />  函数库分为静态库和动态库两种。<br /> <br />  静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。<br /> <br />  动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。<br /> <br />  本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。<br /> <br />  在创

zjjyliuweijie的专栏 2万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Linux之动态库和静态库

本文介绍了如何自定义动态库、静态库以及如何使用自定义的动态库和静态库。

一只小卷毛的博客 2933

Linux: 静态库和动态库

在Linux环境下,我们使用gcc编译链接代码时,可以分为静态链接和动态链接。静态链接即在编译链接时,将代码所使用到的静态库文件代码全部拷贝到可执行文件中(拷贝实质上是将库文件的代码展开拷贝至我们的可执行程序的代码段。,这样做的缺点是可执行文件会生成的比较大,优点是此时再运行可执行文件就不需要再查找库了。静态库文件一般以.a 结尾动态链接不会在编译时将动态库文件的代码加入到可执行文件中,而是在可执行文件运行时,去查找所需的动态库,并将其加载到相应的进程中,并且不同的进程可以共享这些动态库。

2301_79927432的博客 1465

Linux系统中的静态库和动态库

Linux系统中的静态库和动态库

2403_82436914的博客 1040

Linux动态库和静态库

做库时,头文件(.h)必须暴露,源文件(.c)必须隐藏。操作:将需要形成库的文件编译成.o文件:这时候就可以把头文件和库文件交给另外一个人使用。

pouop的博客 1360

Linux 静态库和动态库

在实际开发中,我们把通用的函数和类分文件编写,称之为库。在其它的程序中,可以使用库中的函数和类。一般来说,通用的函数和类不提供源代码文件(安全性、商业机密),而是编译成二进制文件。库的二进制文件有两种:静态库和动态库。

qq_41885018的博客 1438

Linux 动态库与静态库

对于可能频繁用到的源文件,比如这里的test1.c、test2.c、test3.c、test4.c,我们可以将它们的目标文件test1.o、test2.o、test3.o、test4.o进行打包,之后需要用到这四个目标文件时就可以之间链接这个包当中的目标文件了,而这个包实际上就可以称之为一个库。因为我们使用gcc编译的是C语言,而gcc就是用来编译C程序的,所以gcc编译的时候默认就找的是C库,但此时我们要链接的是哪一个库编译器是不知道的,因此我们还是需要使用-l选项,指明需要链接库文件路径下的哪一个库。

weixin_74006549的博客 1176

【Linux】静态库 && 动态库

动静态也是文件也有自己的inode编号,在执行程序./main,程序加载到内存里面【二进制】,内存 ---页表 --- 进程 形成映射关系,可执行程序知道自己依赖哪些库,动态库也会加载到内存里面,新加载的库 --- 页表 --- 进程 形成映射,映射到进程的虚拟地址空间的共享区,当代码在编译时,需要调库就直接跳转到共享区执行所对应的方法,执行完再返回正文代码中,因此整个进程执行库方法,全都是在自己的地址空间中跳转运行的。【将当前所在的库路径添加到环境变量列表当中】库是写好的现有的,成熟的,可以复⽤的代码。

C/C++、数据结构、Linux.... 984

【Linux】Linux静态库和动态库基础

静态库与动态库的概念及使用流程 静态库在编译阶段嵌入可执行文件,生成独立程序,文件后缀为.a。优点包括独立性强、启动速度快,缺点是体积大且更新麻烦。动态库则在运行时加载,后缀为.so,具有体积小、更新方便的优点,但依赖环境且启动稍慢。 静态库制作流程:1) 编译源文件为.o;2) 用ar工具打包为.a文件;3) 发布库文件和头文件。使用时需指定头文件路径(-I)和库路径(-L)。动态库制作类似,但需-fPIC编译,使用ldconfig或环境变量配置路径。 关键区别: 静态库:编译时链接,独立性强 动态库:运

Antonio915的博客 1535
上一篇: 关于Bearer Token
下一篇: Linux跑后台服务
UU_Yang
博客等级 码龄23年 926粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值