【Linux】静态库的制作和使用详解

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶🔹C++🔹Liunx
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍
文章目录
- 一、库的基础知识
- 二、如何编写静态库
- 1.原理简述
- 2.实际操作
- 使用makefile文件自动化构建
- 静态库的使用
前言:
本篇博客讲解两个类型的库:动态库(.so) 和 静态库(.a).的制作。
一、库的基础知识
库的作用:提升开发效率。隐藏源代码
库的本质:将所有的[.o]结尾的可执行目标二进制文件打包形成一个文件夹。
二、如何编写静态库
1.原理简述
你编写了好几个文件,给别人使用,但是又不想让使用者看到内部源代码,此时有没有什么办法呢。
本质就是隐藏.c源文件。
-
第一步:将所有.c的文件形成.o文件
-
第二步:将所有的.o使用
ar指令打包成一个库文件。 -
具体流程如下图:

这样做的好出有:
(1)将所有的源文件打包好,防止使用者再拷贝时丢失原文件。提高了使用效率。
(2)使用者无法查看源码,提高了安全性
2.实际操作
分别创建了4个文件:mymath.h mymath.c myprint.h myprint.c.
- 1.<mymath.h>:
#pragma once
#include<stdio.h> extern int addToTarget(int start, int end);//声明函数
- 2.mymath.c
#include "mymath.h" # //这段函数的作用是计算start-end之间的和int addToTarget(int start, int end) { int sum = 0; int i = start; for(i; i <= end; i++){ sum += i; } return sum; }
- 3.myprint.h
#pragma once #include<stdio.h>
#include<time.h> extern void Print(const char* str);
- 4.myprint.c
#include "myprint.h" //这段函数功能是输出传入的字符串,后面加上时间戳
void Print(const char* str)
{printf("%s[%d]\n",str,(int)(time(NULL)));
}
有了上面四个文件后,还需要写一个main方法使用这些函数。
#include "myprint.h"
#include "mymath.h" int main()
{ Print("hello,world"); int res = addToTarget(1,100); printf("res: %d\n",res); return 0;
}
开始制作静态库:
第一步:将所有的.c文件–>.o文件
使用gcc的【-c】选项,代码如下:
gcc -o myprint.o -c myprint.c
gcc -o mymath.o -c mymath.c
注意:main函数不用参与,每个使用者都会有自己的main方法去调用库文件。
第二步:o文件打包成名字叫hello的静态库
知识补充:
【ar】指令:
ar-[选项]+lib+库文件名.a+所有.o文件
选项这里只说r(replace替换),c(create创建)就可以了,就足以让我们创建静态库了.
注意: 格式一定是lib+库文件名.a。也就是说要形成的静态库的名字 前缀必须是lib,后缀必须是.a,中间可以随便起名字.
执行代码:
ar -rc libhello.a main.o myprint.o mymath.o

可以发现,此时目录下面就会存在刚打包好的库文件了,但是,还需要结合对应的头文件才能正确的使用库文件中的函数。往下学!
使用makefile文件自动化构建
理清楚一个文件形成静态库的过程后 总结来说: .c文件 —> .o文件 —>
打包形成静态库
既然是这么一套固定的流程,那么我们完全可以用Makefile来完成这些工作。需要注意的是搞清各个文件的依赖关系,然后再进行编写。
所以最后的Makefile编写如下:
libhello.a: mymath.o myprint.o ar -rc libhello.a mymath.o myprint.o
mymath.o : mymath.c gcc -o mymath.o -c mymath.c
myprint.o: myprint.c gcc -o myprint.o -c myprint.c .PHONY:clean
clean: rm -rf *.o libhello.a

这样还没有结束:还有对应的许多头文件呢。一般都是.h声明,然后从.o打包形成的库里面找。
-
所以我们还需要做一件工作:将.h和.a文件规整到一起.在Makefile加入以内容:就是将头文件和库文件规整在一起,逻辑如下

-

-
makefile代码如下
.PHONY:hello
hello: mkdir -p hello/lib mkdir -p hello/include cp -rf *.h hello/include cp -rf *.a hello/lib
- 总结来说: .c文件 —> .o文件 —> 打包形成静态库–>最后将.h和.a文件规整到一起
这样就制作好了一个静态库!如何去使用呢?
静态库的使用
方法一:直接拷贝到系统路径
头文件gcc系统默认搜索路径是:
/usr/include
库文件gcc系统默认搜索路径是:/lib64 或者 /usr/lib64
- 可以将你编写的静态库拷贝进/usr/lib64。头文件拷贝进/usr/include ;但是这样做会污染原来别人已经写好的库。不建议使用
方法二:指定路径搜索
我们可以直接在编译的时候加上头文件和库文件的路径.
对于上面的代码我们执行:
gcc main.c -I ./hello/include/ -L ./hello/lib/ -lhello
就可以指定路径进行查找。
选项:
-I(i的大写)表示头文件的搜索路径
-L表示库文件的搜索路径
-l(小写的L)表示在特定路径下,要使用哪一个库.
相关文章:
【Linux】静态库的制作和使用详解
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
2.贪心算法.基础
2.贪心算法.基础 基础知识题目1.分发饼干2.摆动序列2.1.思路二:动态规划法 3.最大子序和4.买股票的最佳时机24.1.思路二:动态规划法4.2.买股票的最佳时机 5.跳跃游戏5.1.跳跃游戏2 6.K次取反后最大化的数组和7.加油站8.分发糖果 总结 基础知识 什么是贪…...
用Python轻松转换PDF为CSV
数据的可访问性和可操作性是数据管理的核心要素。PDF格式因其跨平台兼容性和版面固定性,在文档分享和打印方面表现出色,尤其适用于报表、调查结果等数据的存储。然而,PDF的非结构化特性限制了其在数据分析领域的应用。相比之下,CS…...
关于微信支付-商户平台:查询订单提示“查询失败:操作失败,请稍候重试”的分析
目录 引子 分析 应对 小结 引子 在开发和实施微信 JSAPI 支付的应用后,我们遇到了一些问题,订单的状态更新不正常,当然我们首先需要从自身寻找原因和完善解决问题的办法和方案。在支付的过程中,客户会给我们一些反馈…...
掌握【Python异常处理】:打造健壮代码的现代编程指南
目录 编辑 1. 什么是异常? 知识点 示例 小李的理解 2. 常见的内置异常类型 知识点 示例 小李的理解 3. 异常机制的意义 知识点 示例 小李的理解 4. 如何处理异常 知识点 示例 小李的理解 5. 抛出异常 知识点 示例 小李的理解 6. Python内置…...
STM32点灯闪烁
stm32c8t6引脚图 开发板引脚图 GPIO端口的每个位可以由软件分别配置成 多种模式。 ─ 输入浮空 ─ 输入上拉 ─ 输入下拉 ─ 模拟输入 ─ 开漏输出 ─ 推挽式输出 ─ 推挽式复用功能 ─ 开漏复用功能 配置GPIO端口步骤:开启时钟->使用结构体设置输出模式…...
Java-01-源码篇-04集合-05-SortedMap NavigableMap TreeMap
目录 一,SortedMap 二,NavigableMap 三,TreeMap 3.1 TreeMap 继承结构 3.2 TreeMap 属性 3.3 TreeMap 构造器 3.4 TreeMap 内部类 3.4.1 Values 3.4.2 KeySet 3.4.3 EntrySet 3.4.5 相关集合迭代器 3.4.5.1 PrivateEntryIterato…...
拥抱 AGI:PieDataCS 引领云原生数据计算系统新范式
自2023年后,人工智能技术进入了一个更为成熟和广泛应用的阶段,人工通用智能(AGI)这一概念也成为了科技界和产业界热议的焦点。本文将结合 AGI 时代背景,从架构设计到落地实践,详细介绍拓数派云原生数据计算…...
开放式耳机哪个品牌好?开放式耳机推荐
开放式耳机因其独特的设计,提供了更自然的听音体验和更好的环境声音感知,尤其适合长时间佩戴和户外运动使用,下面来推荐几款表现出色的开放式耳机: 悠律ringbuds pro凝声环(499元):凭借时尚潮流…...
kubernetes dashboard安装
1.查看符合自己版本的kubernetes Dashboard 比如我使用的是1.23.0版本 https://github.com/kubernetes/dashboard/releases?page5 对应版本 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml修改对应的yaml,…...
【MySQL】3.表的操作
表的操作 一.创建表二.查看表三.修改表四.删除表 一.创建表 create table [if not exists] tb_name( field1 datatype comment 说明, field2 datatype, field3 datatype) charsetutf8 collateutf8_gerenal_ci engineInnoDB//表的编码集,校验集如果不指定ÿ…...
十一、作业
1.从大到小输出 写代码将三个整数数按从大到小输出。 void Swap(int* px, int* py) {int tmp *px;*px *py;*py tmp;} int main() {int a 0;int b 0;int c 0;scanf("%d %d %d", &a, &b, &c);int n 0;if (a<b){Swap(&a, &b);}if (a &l…...
关于C#在WPF中如何使用“抽屉”控件
关于C#在WPF中如何使用“抽屉”控件 1.前提准备2.XAML代码3.对应的C#代码4.显示效果 1.前提准备 需要引用MaterialDesign控件库,关于如何引用,请参照文章——关于C#如何引用MaterialDesign控件库 2.XAML代码 <Window x:Class"MaterialDesign_…...
运维Tips | Ubuntu 24.04 安装配置 xrdp 远程桌面服务
[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] Ubuntu 24.04 Desktop 安装配置 xrdp 远程桌面服务 描述:Xrdp是一个微软远程桌面协议(RDP)的开源实现,它允许我们通过图形界面控制远程系统。这里使…...
ExcelVBA运用Excel的【条件格式】(二)
ExcelVBA运用Excel的【条件格式】(二) 前面知识点回顾 1. 访问 FormatConditions 集合 Range.FormatConditions 2. 添加条件格式 FormatConditions.Add 方法 语法 表达式。添加 (类型、 运算符、 Expression1、 Expression2) 3. 修改或删除条件…...
肠道和大脑中犬尿氨酸代谢途径的紊乱
新出现的证据表明,肠道微生物群可能与宿主大脑相互作用,并在神经精神疾病的发病机制中发挥关键作用。然而,抑郁症中微生物-肠-脑轴相互作用的潜在机制仍不清楚。在这项研究中,建立了慢性约束应激 (CRS) 的小鼠模型,以研…...
vue通过后台返回的数字显示不同的文字内容,多个内容用、隔开
后台返回的数据 显示效果: html: <el-table-columnalign"center"label"使用过的小程序"width"124"v-if"activeTab 0"><template #default"scope"><divv-for"(item, index) in s…...
Flume工具详解
Flume是一个由Apache提供的开源日志收集系统,最初由Cloudera贡献。它以其高可用性、高可靠性和分布式特性而著称,被广泛应用于海量日志的采集、聚合和传输。以下是对Flume工具的详细解析: 一、概述 功能定位:Flume主要用于收集、…...
vulhub-activemq(CVE-2016-3088)
在 Apache ActiveMQ 5.12.x~5.13.x 版本中,默认关闭了 fileserver 这个应用(不过,可以在conf/jetty.xml 中开启);在 5.14.0 版本后,彻底删除了 fileserver 应用。【所以在渗透测试过程中要确定好 ActiveMQ …...
上海市计算机学会竞赛平台2024年6月月赛丙组超级奇数
题目描述 如果一个十进制数的所有数字都是奇数,则称之为超级奇数,例如 35733573 就是一个超级奇数,而 3141531415 不是。按照从小到大排序,前几名的超级奇数为 1,3,5,7,9,11,13,15,17,⋯1,3,5,7,9,11,13,15,17,⋯ 给定一个超级…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
