news 2026/6/10 1:17:36

Linux系统编程:动静态库的操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux系统编程:动静态库的操作

一、动静态库的基本介绍

在Linux操作系统中静态库文件是以 .a 作为后缀的,动态库以 .so 作为后缀。

  • 静态库(.a):静态库的代码是在程序编译链接的时候就被链接到可执行文件当中的,在程序运行的时候就不需要静态库代码了。
  • 动态库(.so):动态库的代码是程序运行的时候才去链接的,多个程序可以共享使用动态库的代码。

一个动态库链接的可执行文件只包含这个可执行文件用到的动态库内函数入口地址的一个表,而不是该函数所在目标文件的整个机器码。也就是说,

当可执行文件用到动态库的某个函数时,链接到可执行文件当中的只有这些函数入口的地址,并没有这些函数的具体实现方法。*

  • 动态链接是指在可执行文件运行之前,操作系统就会将该可执行文件运用到的动态库函数的具体实现代码从磁盘加载到内存里。
  • 静态链接是在可执行文件编译链接时就将静态库拷贝到可执行文件当中。

动静态库的命名方式为 lib + 库名 + 后缀 ,例如libxxx.a表示静态库,libxxx.so表示动态库。

二、静态库

1.生成静态库

静态库:在程序编译链接阶段,会把库的代码链接到自己的可执行文件中,程序运行的时候将不再依赖静态库(静态库融入了你的可执行文件),可执行下面的指令转化为静态链接

gcc text.o-o hello_static-static

我们知道,库里面是具体的方法实现,一般调用库都是声明头文件,也只给你头文件

现在,我们来一个 library.c 作为函数具体的方法实现,库文件是二进制文件,所以先打包成二进制

123intAdd(inta,intb)4{5returna+b;6}78intSub(inta,intb)9{10returna-b;11}1213intMul(inta,intb)14{15returna*b;16}1718intDiv(inta,intb)19{20if(b==0)21{22return-1;23}24returna/b;25}
gcc-c library.c-o mylib.o

我们现在将其打包成二进制文件。


形成静态库

用 ar 工具(静态库打包工具)将 .o 文件打包成静态库

静态库命名规则:通常以 lib 开头,以 .a 结尾(比如 libmath.a)

  • ar 是打包命令
  • r:如果库中已有同名文件,替换它
  • c:如果库不存在,创建它
  • s:为库生成索引(加速链接时的查找)
ar rcs libmyself.a mylib.o


接下来我们就静态库,我们现在已经实现完成为 libmyself.a,再来完善一下头文件。
头文件为声明,通过头文件+静态库,即可以完成调用,例如:main.c调用,头文件library.h

接下来我们就可以链接自己的静态库了
通过 gcc 执行下面选项,链接自己的静态库:

-L.:告诉编译器 “在当前目录(.)查找静态库”;

-lmath:指定要链接的静态库(libmath.a 省略 lib 和 .a 后就是 math)

gcc main.c-oHello(目标文件)-L.-lmyself(静态库)

我们现在是通过 main 函数调用 头文件+静态库 完成调用自己的静态库

我们每次执行的 main 函数工作目录由我们控制,那如果 头文件和静态库 是分离的呢?

解决方案:告诉编译器头文件和静态库的位置

告诉编译器头文件位置:

用 -I(大写的 i)参数,后面跟 “头文件所在的文件夹路径”,例如:

math_lib.h 在 ./include(./ 表示 “当前目录”),就加 -I./include

告诉编译器静态库位置:

用 -L(大写的 l)参数,后面跟 “静态库所在的文件夹路径”。例如:

libmath.a 在 ./lib,就加 -L./lib

gcc main.c-o Hello-I./Path1-L./Path1-lmyself(必须指定库名)

三、动态库生成

动态库和静态库一样也是要先形成 .o 文件,但是动态库需要形成与位置无关的 .o文件,所以需要加上-fPIC选项,输入指令gcc -fPIC -c mymath.c -o mymath.o、gcc -fPIC -c myprint.c -o myprint.o生成 .o 文件,然后输入指令gcc -shared -o libmymath.so mymath.o myprint.o将所有的 .o 文件打包。

  • fPIC:生成位置无关代码(Position-Independent Code),动态库必需
  • c:只编译不链接,生成目标文件(.o)
  • o myprint.o:指定输出的目标文件名

四、总结一下

静态库的形成:

(1)函数实现打包成二进制

gcc-c library.c-o mylib.o

(2)形成静态库

ar rcs libmyself.a mylib.o

动态库的形成:

(1)生成无关代码

ar rcs libmymath.a myprint.o

(2)链接为共享库

gcc-shared-o libmymath.so myprint.o

路径问题:

在形成静/动态库之后,每次编译为可执行文件都需要通过 .I 或者 .L 告诉编译器头文件、库的位置

这无非就是一个路径问题,那么有没有办法在每次编译时不使用这两个选项呢?
有的.

  1. 头文件可以直接干到系统的默认搜索路径下
  2. 刷新动态库缓冲器
  3. 环境变量

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 15:05:53

5步实现企业流程数字化转型:RuoYi-Cloud-Plus工作流实战指南

5步实现企业流程数字化转型:RuoYi-Cloud-Plus工作流实战指南 【免费下载链接】RuoYi-Cloud-Plus 微服务管理系统 重写RuoYi-Cloud所有功能 整合 SpringCloudAlibaba、Dubbo3.0、Sa-Token、Mybatis-Plus、MQ、Warm-Flow工作流、ES、Docker 全方位升级 定期同步 项目…

作者头像 李华
网站建设 2026/6/9 23:34:04

软件测试评估高频例题+详细解答,新手必看!

软件测试评估高频例题详细解答,新手必看! 文章目录软件测试评估高频例题详细解答,新手必看!一、基础概念题:筑牢测试认知基石例题1:软件测试的核心目的是什么?例题2:请简述黑盒测试和…

作者头像 李华
网站建设 2026/6/9 10:34:04

机场货库区平板车预测算法与路径规划研究框架

机场货库区环境特殊:时间敏感性强、安全要求高、多主体协同复杂。以下是一个系统研究框架: 一、核心研究问题拆解 1.1 预测算法研究维度 需求预测:航班动态→货物吞吐量→平板车需求量 到达预测:外部车辆到达时间、内部车辆周转时间 拥堵预测:关键节点(安检口、装卸区)…

作者头像 李华
网站建设 2026/6/8 9:44:28

CopilotKit多用户AI协作:构建下一代智能交互应用

CopilotKit多用户AI协作:构建下一代智能交互应用 【免费下载链接】CopilotKit Build in-app AI chatbots 🤖, and AI-powered Textareas ✨, into react web apps. 项目地址: https://gitcode.com/GitHub_Trending/co/CopilotKit 在当今数字化工作…

作者头像 李华
网站建设 2026/6/9 19:15:31

Python 类方法、实例方法和静态方法:何时使用以及如何区分?

在 Python 中,类是定义数据和行为蓝图的核心。定义在类内部的函数通常被称为方法,但它们根据其如何被调用以及能访问哪些数据,可以分为三种主要类型:类方法 (classmethod)、实例方法(默认)和静态方法 (stat…

作者头像 李华
网站建设 2026/6/8 10:00:14

LiteIDE X38.4终极实战指南:10分钟掌握高效Go开发

LiteIDE X38.4终极实战指南:10分钟掌握高效Go开发 【免费下载链接】liteide LiteIDE is a simple, open source, cross-platform Go IDE. 项目地址: https://gitcode.com/gh_mirrors/li/liteide 还在为复杂的Go开发环境配置而头疼吗?想要一款既轻…

作者头像 李华