当前位置: 首页 > news >正文

Linux系统编程(十一)--- 动态库、静态库

一、静态库与动态库的基本概念

  • 动态库(共享库):文件名为libxxx.so
    编译和运行时都需要库文件存在。程序运行时,动态库被动态加载,多个程序可以共享内存中的同一份动态库代码,节省内存和磁盘空间。

  • 静态库:文件名为libxxx.a
    编译时需要库文件存在,链接器会将库中用到的代码复制到最终的可执行文件中。运行时不再需要静态库文件,可执行文件是独立的。

必须写libxxx.so(xxx是你想定义的名字)


二、生成静态库的命令

gcc -c fun.c -o fun.o ar -rcv libfun.a fun.o
  • 第一步用gcc -c编译出目标文件fun.o(不链接)。

  • 第二步用ar工具将fun.o(有很多的.o就在后面加上)打包成静态库libfun.a
    -r表示插入/替换,-c表示不显示创建信息,-v表示详细输出。

这是生成静态库的标准做法。


三、生成动态库的命令

gcc -fPIC -shared fun.c -o libfun.so
  • -fPIC:生成位置无关代码(Position Independent Code),这是动态库所必需的,这样代码可以被加载到内存的任何位置。

  • -shared:生成共享库(即动态库)。

  • -o libfun.so:指定输出的动态库文件名。

(有很多的.c就在后面加上)


四、编译时链接库的方式

gcc main.c -lfun # 库文件必须存在于系统PATH下 gcc main.c -lfun -L ./ # 库文件存在于-L指定的路径下

这里需要澄清两点:

  1. 库文件搜索路径与PATH无关
    -lfun会让编译器在标准系统库目录(如/usr/lib/lib)以及由-L指定的目录中查找libfun.solibfun.a
    这里的“系统PATH下”属于表述不准确,应该是“系统库默认路径下”。

  2. 链接时的查找顺序

    • 如果同时存在静态库和动态库,默认优先链接动态库(除非使用-static强制静态)。

    • 使用-L ./可以让编译器在当前目录下搜索库文件。

假如你的动态库是libxxx则命令为:gcc main.c -lxxx

注意:程序运行时:目标平台的系统PATH下必须存在libxxx.so

http://www.cnnetsun.cn/news/1542900.html

相关文章:

  • 终极指南:10分钟语音数据打造专业级AI变声模型
  • 终极指南:Windows三指拖拽功能的完整解决方案
  • 面试硬核双杀!合并 K 个升序链表 + LRU 缓存|力扣高频手撕原题全解
  • 终极解决方案:如何用G-Helper一键恢复ROG游戏本色彩配置文件
  • 为什么92%的金融级Python项目已在Q1完成AOT安全迁移,而你还在用CPython解释器?
  • 【Python原生AOT编译2026终极指南】:6大高频报错根源定位+3步热修复方案(PyO3/CPython 3.14+实测有效)
  • 为什么你的Python网关在EMC测试中随机重启?深度拆解CPython嵌入式移植的6大实时性盲区(附FreeRTOS+Python3.11混合调度方案)
  • 别再只盯着像素了!从镜头到屏幕:一次搞懂影响你手机成片效果的完整链路(附避坑指南)
  • volatile vs synchronized:Java 并发两大护法
  • Transformer回顾与BERT模型学习:小白程序员必备收藏指南
  • 思源宋体终极编译指南:从源码到可部署字体的完整流程
  • Qwen-Image-Lightning参数详解:10个关键设置提升生成质量
  • Docker Desktop+WSL2自定义安装路径实战指南
  • 键盘优化:机械键盘连击修复与输入稳定解决方案实战指南
  • 用Python+海康工业相机(MV-CH120-60UM)搭建一个简易的条形码扫描器(附完整代码)
  • Java毕业设计基于springboot+vue的武汉周边农家乐信息管理系统
  • OpCore-Simplify:2024年最完整的黑苹果自动化EFI构建终极指南
  • KITTI数据集实战指南:从下载到3D物体检测的完整流程(附避坑技巧)
  • open_clip:多模态模型工业化落地全方案
  • 【uniapp实战】相册图片二维码识别:从压缩优化到原生API调用的完整指南
  • OpenClaw调试技巧:GLM-4.7-Flash复杂任务拆解的5个可视化工具
  • DanKoe 视频笔记:说服性沟通:21 世纪的核心技能 [特殊字符]
  • ESP32语音交互开发实战:从离线唤醒到智能家居控制
  • 突破显卡限制:OptiScaler实现全平台AI超分辨率技术自由切换
  • Java SpringBoot+Vue3+MyBatis 学生成绩分析和弱项辅助系统系统源码|前后端分离+MySQL数据库
  • CCM Buck变换器建模进阶:从平均模型到小信号分析的实践指南
  • 告别Ollama本地部署!用硅基流动API+DeepSeek R1,5分钟搞定AI桌宠语音聊天
  • 淘宝淘金币自动脚本:每天节省20分钟的免费终极解决方案
  • 老旧Mac如何焕发新生?OpenCore Legacy Patcher全流程系统升级指南
  • llamafactory环境配置与关键包版本兼容性指南