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

【Linux】静态库(.a) + 动态库(.so)

Linux 静态库(.a) 动态库(.so)统一示例库名test→ 静态库libtest.a动态库libtest.so源文件test.c、main.c头文件路径./include库文件路径./lib用户家目录路径/home/youruser/yourlib一、必备编译参数参数作用-I ./include指定头文件搜索路径-L ./lib指定库文件搜索路径-ltest链接libtest.a/libtest.so-fPIC编译动态库必须加位置无关代码-shared生成动态库-Wl,-rpath./lib程序自带运行库路径二、静态库 libtest.a 制作 使用1. 目录结构./include/test.h test.c main.c ./lib/2. 制作静态库# 1. 编译成 .o 目标文件gcc-ctest.c-otest.o-I./include# 2. 打包静态库标准命令 ar rcsar rcs libtest.a test.o# 3. 移动到库目录mkdir-plibmvlibtest.a ./lib/3. ar 常用完整参数r添加/替换文件c库不存在则创建s生成符号索引必须t查看库内容d删除成员x提取 .ov显示详情ar t ./lib/libtest.a# 查看库内容ar d ./lib/libtest.a test.o# 删除库中文件ar x ./lib/libtest.a# 提取文件4. 编译可执行文件gcc main.c-otest_static-I./include-L./lib-ltest5. 运行静态库无依赖直接运行./test_static三、动态库 libtest.so 制作 使用1. 制作动态库# 1. 编译位置无关目标文件gcc-c-fPICtest.c-otest.o-I./include# 2. 生成动态库gcc-sharedtest.o-olibtest.so# 3. 移动到库目录mkdir-plibmvlibtest.so ./lib/2. 编译程序gcc main.c-otest_dynamic-I./include-L./lib-ltest3. 运行动态库4种标准方法方法1临时环境变量临时测试exportLD_LIBRARY_PATH./lib:$LD_LIBRARY_PATH./test_dynamic方法2单次有效不污染环境最推荐LD_LIBRARY_PATH./lib ./test_dynamic方法3复制到系统库目录永久sudocp./lib/libtest.so /usr/libsudoldconfig ./test_dynamic方法4自定义配置文件最规范永久echo/home/youruser/yourlib|sudotee/etc/ld.so.conf.d/mytest.confsudoldconfig ./test_dynamic方法5编译时写死路径自带路径gcc main.c-otest_dynamic-I./include-L./lib-ltest-Wl,-rpath./lib ./test_dynamic四、静态库 vs 动态库 核心对比项目静态库 .a动态库 .so加载时机编译时拷贝进程序运行时加载运行依赖无必须配置路径程序体积大小内存多进程重复占用共享内存更新库需重编程序替换 .so 即可运行速度快稍慢五、同一目录下同时存在 .a 和 .so 时如何选择链接方式当同一个目录下同时存在libtest.a和libtest.sogcc 有明确的默认规则1. 默认行为gcc 优先选择动态库.sogcc main.c-L./lib-ltest-otest_dynamic→ 链接的是libtest.so2. 强制使用静态库加-static参数gcc 会只找静态库忽略动态库-static必须放在-ltest前面-L先定路径 →-static再定静态 →-l最后链接库gcc main.c -I./include -L.-static-ltest-otest_static→ 链接的是libtest.a3. 验证链接了哪种库ldd test_dynamic# 显示依赖 libtest.so → 动态链接ldd test_static# 显示 not a dynamic executable → 静态链接五、关键注意事项ar rcs是创建静态库标准写法动态库必须加-fPICexport LD_LIBRARY_PATH./lib:$LD_LIBRARY_PATH追加路径不覆盖链接库-l 库名自动省略 lib 和 后缀永久配置路径后必须执行ldconfig同一目录下同时存在libtest.a和libtest.so时默认不加参数gcc 优先链接动态库 .so加-static参数强制链接静态库 .a可使用ldd 可执行文件查看程序是否依赖动态库。

相关文章:

【Linux】静态库(.a) + 动态库(.so)

Linux 静态库(.a) 动态库(.so) 统一示例: 库名:test → 静态库 libtest.a,动态库 libtest.so源文件:test.c、main.c头文件路径:./include库文件路径:./lib用户家目录路径:/home/youruser/yourl…...

OpenClaw技能扩展实战:用Qwen3-14B镜像自动生成技术文档

OpenClaw技能扩展实战:用Qwen3-14B镜像自动生成技术文档 1. 为什么需要自动化文档生成 作为一个经常需要编写技术文档的开发者,我长期被两个问题困扰:一是文档写作耗时太长,二是维护成本太高。每次代码更新后,文档版…...

英雄联盟录像编辑终极指南:免费开源工具League Director完全教程

英雄联盟录像编辑终极指南:免费开源工具League Director完全教程 【免费下载链接】leaguedirector League Director is a tool for staging and recording videos from League of Legends replays 项目地址: https://gitcode.com/gh_mirrors/le/leaguedirector …...

基于IEEE33节点的节点碳势计算与可视化 摘要:代码主要是基于IEEE33节点这个标准算例

基于IEEE33节点的节点碳势计算与可视化 摘要:代码主要是基于IEEE33节点这个标准算例,然后对各个节点碳势进行了逐一的计算,计算完毕后,通过MATLAB编程,对各个节点的碳势进行了可视化,非常清晰的一个代码&am…...

OpenClaw技能市场巡礼:Top10Qwen3.5-9B增强插件测评

OpenClaw技能市场巡礼:Top10 Qwen3.5-9B增强插件测评 1. 为什么需要关注OpenClaw技能市场? 第一次接触OpenClaw时,我被它"AI操控电脑"的核心能力震撼,但真正让我持续使用的原因是它的技能市场(ClawHub&…...

如何让你的第三方鼠标在macOS上重获新生?Mac Mouse Fix让普通鼠标体验提升300%

如何让你的第三方鼠标在macOS上重获新生?Mac Mouse Fix让普通鼠标体验提升300% 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 你是…...

STM32主控的三相逆变器及单相/三相逆变程序实现

三相逆变 单相/三相逆变器 SPWM ---stm32主控(输入、输出具体可根据需要设定),本逆变器可以二次开发。 本内容只包括 逆变程序,实现变频(0~100Hz)、变压调节,均有外接按键控制(使用C…...

像素史诗·智识终端Claude Code实践:自动化代码生成与审查

像素史诗智识终端Claude Code实践:自动化代码生成与审查 1. 开发者的新助手 最近在开发圈里,一个叫"像素史诗智识终端"的工具开始引起关注。它集成了类似Claude Code的智能代码能力,正在改变开发者们日常工作的方式。想象一下&am…...

godot自身节点能拖进脚本 其他场景中的节点得实例化才能拖

自身节点能拖进自己脚本 但是其他场景的节点得实例化那个场景才能拖 不然是$....

GHelper:华硕笔记本终极性能调校指南 - 轻量级硬件控制神器

GHelper:华硕笔记本终极性能调校指南 - 轻量级硬件控制神器 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Stri…...

【GESP】C++五级练习题 luogu-P1226 【模板】快速幂

GESP C 五级练习题,考查并应用快速幂知识点。题目难度⭐⭐☆☆☆,洛谷难度等级普及−。 luogu-P1226 【模板】快速幂 题目要求 题目题解详见:https://www.coderli.com/gesp-5-luogu-p1226/ https://www.coderli.com/gesp-5-luogu-p1226/ht…...

如何为Token-Flow开源生态贡献代码?从零开始的贡献者指南

Token-Flow正在逐步开源核心组件,目前已有三个仓库接受贡献。本文手把手教你成为贡献者。 一、哪些项目可以贡献? 项目仓库地址技术栈适合人群tf-client (Python SDK)github.com/token-flow/tf-client-pyPython初学者,文档/测试model-adapt…...

「#影技笔记 1.1.2」:胶片感光原理与显影技术全解析

1. 胶片感光的基础化学原理 当你按下相机快门的那一刻,光线穿过镜头照射在胶片上,一场微观世界的化学反应就此展开。胶片感光的核心秘密藏在那些直径仅0.5-2微米的溴化银晶体里。这些晶体就像无数个微型光探测器,每个晶体表面都存在着被称为&…...

告别命令行:用 Gradio 为本地大模型打造专属 Web 聊天室

1. 为什么需要给本地大模型加个Web界面? 还在用命令行和你的本地大模型聊天吗?每次打开终端输入命令,看着密密麻麻的文本输出,是不是感觉像是在和一台老式打字机对话?作为一个折腾过各种大模型的开发者,我完…...

DuiEditor入门指南:从零开始构建duilib界面(DuiDesigner替代方案)

1. DuiEditor:重新定义duilib界面开发体验 第一次接触duilib界面开发的朋友,往往会被手写XML的繁琐劝退。作为一个从2013年就开始使用duilib的老开发者,我深刻理解这种痛苦——每次调整布局都要反复修改XML文件,一个属性拼写错误就…...

Python多线程详解:原理、应用场景与实战指南(I_O密集型首选)

Python多线程详解:原理、应用场景与实战指南(I/O密集型首选) 在Python并发编程领域,多线程是最基础、最常用的并发实现方式,凭借轻量、易上手、数据共享便捷等优势,成为处理I/O密集型任务的首选方案。很多P…...

Music Tag Web:3大核心能力重塑你的音乐库管理体验

Music Tag Web:3大核心能力重塑你的音乐库管理体验 【免费下载链接】music-tag-web 音乐标签编辑器,可编辑本地音乐文件的元数据(Editable local music file metadata.) 项目地址: https://gitcode.com/gh_mirrors/mu/music-tag…...

避坑指南:Python调用摄像头常见问题(驱动、权限、多摄像头切换)与解决方案

Python摄像头开发避坑实战:从驱动调试到多设备管理的完整解决方案 当你兴奋地写完了Python摄像头调用代码,按下运行键时,屏幕上却跳出"无法打开视频设备"的错误提示——这种挫败感我太熟悉了。作为经历过无数次摄像头调试折磨的开发…...

VLA边缘认知系统:Deepoc开发板让除草机器人懂农艺会决策

在智慧农业的发展进程中,农田除草自动化始终受困于田间环境的动态多变与农艺需求的灵活多样,传统预设程序的作业模式,难以应对苗草混杂、地块多变、突发障碍等复杂场景。Deepoc具身模型开发板凭借内置的**VLA(视觉-语言-动作&…...

从自由度到旋转矩阵:机器人学中刚体运动的数学基石

1. 刚体运动的基础:自由度概念解析 刚体运动描述是机器人学中最基础的数学工具,就像学英语要先掌握26个字母一样。我第一次接触这个概念时,被各种专业术语搞得晕头转向,直到把机械臂末端执行器想象成自己手中的螺丝刀才豁然开朗。…...

健壮的容错机制:让Agent优雅降级与自动恢复

健壮的容错机制:让Agent优雅降级与自动恢复 关键词: Agent容错、优雅降级、自动恢复、多Agent系统、心跳检测、重试策略、状态一致性、故障隔离、自适应调节、系统可靠性摘要 在人工智能与软件工程深度融合的当下,自主智能体(Agen…...

Java Swing 实战:手把手教你写一个拼图小游戏(一)

1.前言本文基于 Java Swing 实现带登录注册的拼图小游戏(跟随 B 站黑马程序员教程练习),适合 Java 初学者、课设练手使用。本文为系列第一篇,主要讲解项目整体结构、登录界面(LoginJFrame)和注册界面&#…...

PyCharm与Git高效协作:从配置到团队开发的完整指南

1. PyCharm与Git的黄金组合:为什么它们是天作之合 第一次接触PyCharm和Git的组合时,我还在用传统的FTP上传代码。直到某次误删了重要文件,才意识到版本控制的重要性。现在每次看到新手还在手动备份代码文件夹,我都想冲上去安利这…...

行业内GEO优化服务哪家可靠

行业内可靠的GEO优化服务之选在当今数字化时代,随着用户搜索习惯从传统搜索引擎向生成式AI平台转型,企业面临着传统SEO/社媒营销失效、品牌曝光锐减等问题。GEO(生成式引擎优化)优化服务成为企业抢占AI搜索流量高地的关键。那么&a…...

C++ 拷贝构造函数深度解析:从浅拷贝到深拷贝

引言在 C 面向对象编程中,拷贝构造函数是一个既基础又容易出错的话题。很多初学者(包括曾经的我)在遇到指针成员时,常常因为默认的浅拷贝而导致程序崩溃或内存错误。我想通过自己的学习笔记和实践经验,系统地分享拷贝构…...

PHP爬虫框架大比拼

PHP 爬虫框架介绍PHP 作为服务器端脚本语言,在爬虫领域有多个成熟的框架,以下是主流框架的对比分析:1. Goutte特点:基于 Symfony 组件,轻量易用,适合基础爬取任务。 核心功能:模拟浏览器行为&am…...

新手福音:用快马AI生成你的第一个简易网页网盘项目

作为一个刚接触编程的新手,想要快速上手一个实际项目确实容易感到无从下手。最近我在学习网页开发时,尝试用InsCode(快马)平台做了一个简易网页网盘,整个过程意外地顺利。这个项目虽然功能简单,但涵盖了前端开发的几个核心概念&am…...

G-Helper技术指南:华硕笔记本显示配置与性能优化全解析

G-Helper技术指南:华硕笔记本显示配置与性能优化全解析 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, S…...

OpenClaw隐私保护方案:千问3.5-35B-A3B-FP8本地化数据处理实践

OpenClaw隐私保护方案:千问3.5-35B-A3B-FP8本地化数据处理实践 1. 为什么需要全链路隐私保护 去年我帮一位医生朋友整理病历资料时,突然意识到一个问题:当AI助手能读取患者检查报告、化验单甚至影像资料时,如何确保这些敏感信息…...

告别复杂配置!Fish Speech 1.5 开箱即用,3步搭建你的专属语音合成工具

告别复杂配置!Fish Speech 1.5 开箱即用,3步搭建你的专属语音合成工具 1. 为什么选择Fish Speech 1.5? 语音合成技术正在改变我们与数字世界的交互方式,但传统TTS系统往往需要复杂的音素标注和专业配置。Fish Speech 1.5通过创新…...