【Linux】库制作与原理(一):静态库的制作与使用 📅 发布时间:2026/7/8 22:20:42 👁️ 浏览次数: ✨道路是曲折的前途是光明的 专注C/C、Linux编程与人工智能领域分享学习笔记 感谢各位小伙伴的长期陪伴与支持欢迎文末添加好友一起交流一、基础知识1.1 铺垫二、静态库的制作三、静态库的使用四、总结一、基础知识一些基础的动静态库知识在下面文章中会讲解到可以查阅《Linux编译器gcc/g食用指南》-CSDN博客1.1 铺垫我们日常用 C 语言标准库时只需要#include stdio.h就能调用printf但从来不用关心printf是怎么实现的 —— 这就是库的核心设计逻辑头文件负责 “说明怎么用”库文件负责 “藏住怎么实现”。头文件.h的本质是一份 “使用说明书”里面只声明函数名、参数类型、返回值、外部变量比如extern int errno;告诉编译器 “有这个函数 / 变量你可以这么调用”但不包含任何实际的代码逻辑。而真正的实现代码会被编译成二进制的目标文件.o再打包成库文件静态库.a/ 动态库.so既避免了源码泄露也让用户不用关心底层实现只需要按头文件的说明调用即可。如果要把我们的库给别人使用我们需要提供对应的头文件和方法这个方法就是我们的xxx.o文件。然后用户在自己的mian函数里面使用包含头文件的方法。比如系统把printf的实现编译成二进制库放在 VS / 编译器的默认路径下我们只需要包含stdio.h拿到调用说明编译器就会自动找到对应的库文件把printf的实现链接到我们的程序里。所以接下来我们来看看如何自己制作一个静态库并且使用它。二、静态库的制作我们再此处就实现一个简单的静态库提供加法运算方法。那我们就需要先要明白静态库制作的两个基础文件它们分别是xxx.oxxx.h文件我们这里使用add.c和add.h。//add.h#progmaonce//防止头文件重复包含#includstdio.hexternintmyerrno;//声明错误码intadd(intx,inty);为了能看出错误码起到了作用我们只允许我们的数字0。#includeadd.hintmyerrno0;intadd(intx,inty){if(x0||y0){myerrno1;// 标记错误return0;}myerrno0;// 无错误returnxy;}此时我们就要把我们的源文件.c通过汇编形成我们的目标文件.o。然后就把我们的目标文件打包成库这里就许要使用到我们的归档工具ar它是专门用于我们静态库的打包。静态库需要以lin开头.a结尾这里我们统一使用Makefile自动化构建工具方便我们的后续操作lib libadd.a $(lib):add.o ar -rc $ $^ add.o:add.c gcc -c $^ -o $ .PHONY:clean clean: rm -rf *.a *.o mylib .PHONY:output output:$(lib) mkdir -p mylib/include mkdir -p mylib/addlib cp -f *.h mylib/include cp -f *.a mylib/addlib代码行指令/语法详细解释lib libadd.a变量定义定义名为lib的变量值为libadd.a要生成的静态库名称静态库命名规范是lib开头、.a结尾后续链接时用-ladd即可引用$(lib):add.o构建规则定义静态库libadd.a的依赖关系生成libadd.a必须先有add.o目标文件只有add.o更新/不存在时才会执行下方打包命令ar -rc $ $^打包命令ar是GNU归档工具打包静态库用-r替换/添加文件到静态库-c静态库不存在时创建$自动变量代表当前目标libadd.a$^自动变量代表所有依赖add.o 整行把add.o打包到libadd.a不存在则创建存在则替换add.o:add.c构建规则定义add.o目标文件的依赖关系生成add.o必须先有add.c源文件只有add.c更新/不存在时才会执行下方编译命令gcc -c $^ -o $编译命令gcc是C编译器-c只编译不链接仅生成目标文件.o$^代表依赖文件add.c-o $指定输出文件为$add.o 整行编译add.c生成add.o目标文件.PHONY:clean伪目标声明声明clean是“伪目标”避免当前目录有同名clean文件时make clean规则失效伪目标会强制执行对应命令不检查文件状态clean:目标定义定义clean目标用于清理构建生成的文件rm -rf *.a *.o mylib清理命令rm是删除命令-r递归删除用于删目录-f强制删除无提示*.a删除所有.a后缀文件即libadd.a*.o删除所有.o后缀文件即add.omylib删除交付目录包含拷贝的头文件/库文件.PHONY:output伪目标声明声明output是“伪目标”避免当前目录有同名output文件时规则失效output:$(lib)构建规则定义output目标的依赖关系执行output前必须先生成$(lib)libadd.a确保先有静态库再拷贝文件mkdir -p mylib/include目录创建mkdir是创建目录命令-p目录不存在时创建存在时不报错 整行创建mylib/include目录存放头文件mkdir -p mylib/addlib目录创建同上创建mylib/addlib目录存放静态库文件cp -f *.h mylib/include拷贝命令cp是拷贝命令-f强制覆盖目标目录已有同名文件 整行把当前目录所有.h头文件拷贝到mylib/includecp -f *.a mylib/addlib拷贝命令同上把当前目录所有.a静态库文件拷贝到mylib/addlib我们执行make指令就会现形成目标文件add.o然后让目标文件打包成库libadd.a然后我们在执行make output就可以把所有的.h文件放在mylib目录下的include文件里同样如此我们的库也放在mylib目录下的addlib里如果路径不存在就直接创建。里面的mylib就是我们需要提供给用户的静态库里面包含了头文件和方法。注意因为output目标依赖$(lib)也就是libadd.a所以即使我们跳过make先直接执行make outputMakefile 也会自动先执行make的逻辑生成add.o→打包libadd.a再执行拷贝操作不会出现 “拷贝空库文件” 的问题。三、静态库的使用我们此时站在用户的角度使用我们制作的静态库首先要准备好自己的测试文件test.c下面再写然后把我们提供的静态库目录mylib移动到测试目录下以此模拟用户下载并存放库文件的操作。#includeadd.hintmain(){inta10;intb20;intcadd(a,b);printf(a b %d\n,c);return0;}此时我们想要运行test.c的话就要先使用gcc编译形成可执行程序文件。看到如此多的错误是不是慌了别慌别慌因为我们的gcc test.c是仅编译当前目录源码的极简指令会导致下面的结果。在当前目录找add.h但你的add.h在./mylib/include里找不到不链接任何静态库libadd.a在./mylib/addlib里链接器根本不知道因为找不到add.h所以add函数和printfadd.h里的stdio.h都成了 “隐式声明”最终链接时找不到add的实现直接报错。该如何解决这种情况呢其实有两种解决方法其一便是使用-I-L-l指令。-I指定头文件搜索路径。-L指定库文件搜索路径。-l指明需要链接库文件路径下的哪一个库。此时我们直接运行./a.out即可第二种办法就是直接把我们的头文件和库文件拷贝到系统路径下echo | gcc -E -Wp,-v -查找系统默认头文件路径ld --verbose | grep SEARCH_DIR | tr -s ; \n查看系统默认库文件路径我们直接拷贝sudo cp add.h /usr/local/includesudo cp libadd.a /usr/local/lib明明已经拷贝到系统路径下了为什么还会有错呢gcc test.c只会编译源码但不会自动链接任何自定义库哪怕库文件在系统路径里。你必须显式加-ladd链接器才会去系统库路径/usr/local/lib找libadd.a。如果想要删除你拷贝到系统路径下对应的库我们只需要sudo rm 路径就可以了切记切记路径不要输错说明我们已经删除成功。其实还有一种不需要把第三方库和头文件拷贝到系统路径下的方法那就是软链接通过软链接的方式将第三方库以链接的形式安装到系统的特定的路径下。至于软链接的方法我们前面有讲四、总结通过本次学习我们明确在使用第三方库如自定义静态库时gcc编译指令中的-l库名参数是必须添加的——它的作用是告诉链接器需要链接指定名称的库无论库文件放在自定义路径还是系统默认路径这一步都无法省略。此外链接行为与库的类型/数量相关若系统中仅存在静态库如libadd.agcc会默认链接该静态库若需要链接多个库无论静态库还是动态库只需依次添加多个-l库名参数如-ladd -lmathgcc即可完成多库的链接操作。
(9-2-03)电源管理与能源系统:能耗分析与功率管理(3)基于分布式神经网络架构的人形机器人算力分配 9.2.4 基于分布式神经网络架构的人形机器人算力分配基于分布式神经网络架构的人形机器人算力分配,核心是通过“模块化硬件部署分布式计算节点实时通信总线”,打破传统集中式算力架构的瓶颈,实现算力与任务需求的精准匹配,其技术范… 2026/7/8 22:18:13
一文读懂VR/AR/MR:小白也能分清的虚实交互技术 一文读懂 VR / AR / MR(附 XR)——小白也能分清的虚实交互技术(2026 年最新视角) 2026 年了,头显设备已经从“玩具”变成了部分人的生产力工具和娱乐刚需,但很多人一听到 VR、AR、MR、XR 还是会懵。 其实它… 2026/7/9 9:08:27
Vue 教程 自定义指令 + 生命周期全解析 Vue 3 自定义指令 完整生命周期详解(2025–2026 实用版) Vue 3 的自定义指令和组件生命周期是中高级开发中非常高频的内容,尤其在以下场景中几乎必考/必用: 复杂表单(自动聚焦、输入防抖、权限显隐)拖拽… 2026/7/5 15:03:25
经典游戏兼容性修复终极指南:从系统适配到性能优化的完整解决方案 经典游戏兼容性修复终极指南:从系统适配到性能优化的完整解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 在Windows 10/11等现代操… 2026/7/9 12:21:14
别让“采购的麻烦”变成“实验的瓶颈”:一个平台能改变的事 实验室里的瓶颈,有时候不是科学问题本身,而是那些看起来不起眼的“后勤问题”。采购,恰恰是最容易变成瓶颈的那一个。一个常见但容易被忽视的场景: 实验方案已经设计好了,样本已经准备好了,只剩最后一步——… 2026/7/9 12:21:14
PASCAL-5i 数据集边界标注修复:1行代码解决 mIoU 下降 5% 的复现难题 PASCAL-5i 数据集边界标注修复:1行代码解决 mIoU 下降 5% 的复现难题在复现小样本语义分割算法时,许多研究者都遇到过性能指标显著低于论文结果的困扰。本文将聚焦一个常被忽视却影响巨大的技术细节——PASCAL-5i数据集中边界标注的处理方式,… 2026/7/9 12:19:14
2026最新国内智慧园区厂商怎么选?避坑要点帮你选到靠谱的 摘要:2026年智慧园区选型核心需关注全栈服务能力、落地案例适配性、信创安全合规三大维度,可规避80%以上的常见踩坑风险。行业权威报告显示,近3年国内智慧园区升级项目中62%的效果不达预期问题,源于厂商能力与园区实际需求不匹配。… 2026/7/9 12:17:12
笔记本电脑与工业嵌入式中的NT5CC256M16ER-EKX:4Gb DDR3L低功耗内存应用解析 NT5CC256M16ER-EKX:南亚科技4Gb DDR3L SDRAM内存颗粒深度解析 在笔记本电脑、工业嵌入式系统、网络通信设备以及各类需要低功耗和高性能内存的应用中,DDR3L SDRAM凭借其低电压和成熟的接口优势,成为系统设计中重要的存储组件。南亚科技&… 2026/7/9 12:13:09
STM32F765ZI与ADS127L11构建高精度信号采集系统 1. 项目概述:高精度模拟信号采集系统设计 在工业测量、医疗设备和科学仪器等领域,我们经常需要将微弱的模拟信号转换为高精度的数字数据。这次我选择使用德州仪器的ADS127L11这款24位Δ-Σ ADC与STM32F765ZI高性能MCU搭配,构建一个能够处理宽… 2026/7/9 12:13:09
机器视觉与PLC集成:轮毂缺陷检测与字符识别误差控制在0.2mm内 机器视觉与PLC集成:轮毂缺陷检测与字符识别误差控制在0.2mm内的技术实现轮毂作为汽车关键零部件,其表面质量直接影响行车安全与美观。传统人工检测效率低且易漏检,而采用机器视觉与PLC集成方案可实现微米级精度检测。本文将深入解析高精度视觉… 2026/7/9 0:01:04
GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比 GBase 8a与MySQL 8.0:ALTER TABLE语法差异深度解析与实战指南1. 两种数据库的ALTER TABLE能力全景对比在数据库架构设计和运维过程中,表结构变更(DDL操作)是不可避免的需求。GBase 8a作为国产分析型数据库代表,与开源M… 2026/7/9 0:03:06
【大数据毕业设计】基于多源旅游数据的景区热度分析与推荐系统的设计与实现 基于 Django 的旅游偏好挖掘与景区推荐系统(源码+文档+远程调试,全bao定制等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… 2026/7/9 0:05:09
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08