news 2026/6/14 0:26:13

Linux动静态库

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux动静态库

动静态库

  • 什么是库
    • 静态库的特征
    • 动态库的特征
  • 静态库
    • 站在制作的角度
    • 站在使用者的角度
  • 动态库
    • 站在建立者的角度
    • 站在使用者角度

什么是库

一个可执行程序需要经历 预处理 编译 汇编 链接这四个步骤,静态程序是在形成.o文件时,将它的头文件和库文件进行打包,这个打包的操作就是制造库的操作,完成这个打包就是完成了一个库的建立

#pragmaonce#include<stdio.h>intadd(intx,inty);~
#include"mystdio.h"intadd(intx,inty){returnx+y;}~
#include"mystdio.h"intmain(){printf("1 + 1 = %d\n",add(1,1));return0;}

这是我们自己写的代码,头文件 函数声明和定义分离
指令gcc mystdio.c main.c -o main
成功运行出结果2

#include<stdio.h>intmain(){printf("hello linux\n");return0;}

代码成功运行
通过指令ldd + 文件名 或者 file + 文件名 查看文件依赖

在Linux 中,libxxx.a是静态库, libxxx.so是动态库
linux的gcc/g++编译工具默认是动态链接的,但也是可以强制将它变成静态链接,在末尾加上 -static就行了

静态库的特征

在可执行程序编译链接阶段,如果include的是静态库,那么程序是将静态库里的代码拷贝一份到我们自己本地代码里
优点是存储操作简单
缺点是容易造成空间浪费,尤其是在多个代码使用了同一个头文件之后造成的空间浪费尤其明显

动态库的特征

可执行程序是在运行阶段链接到动态库,它include的是动态库函数的地址表,操作系统会将动态库从磁盘加载到内存里,这个过程叫做动态链接

这里多个问价可以用同一个动态库,如果某一个文件使用了动态库里的全局变量,就会发生写诗拷贝,类似父子进程的关系,这里用到了进程地址空间的相关知识

静态库

站在制作的角度

用刚才的:
mystdio.h
mystdio.c
main,c
制作一个静态库

第一步,将mystdio.c运行成libxxx.a文件,lib是前缀,.a是后缀

这里指令ar -rc libxxx.a 库定义
专门用来建造静态库
-r(replace):若静态库文件当中的目标文件有更新,则用新的目标文件替换旧的
-c(create):建立静态库文件
-t:列出静态库中的文件
-v(verbose):显示库的详细信息

这么手敲一个一个指令太慢了,可以用makefile工具快速简化我们的操作

//这里是makefile代码: libmymath.a:mystdio.o ar-rc libmymath.a mystdio.o mystdio.o:mystdio.c gcc-c mystdio.c-o mystdio.o.PHONY:clean clean:rm-rf mystdio.o libmymath.a lib.PHONY:output output: mkdir-p mylib/lib mkdir-p mylib/includecp*.a./mylib/libcp*.h./mylib/include ~

站在使用者的角度

我们自己制作的静态库或者第三方静态库该如何使用呢?
方法1:
将我们的库放到 /lib64/
再将我们自己的头文件放到 /usr/include/

但是请注意,咱们自己写的库很挫,不要随随便便的就把咱们自己写的库加载到根目录库底下,需要删掉!!!
删掉见下图:


方法二:

通过指令去调用咱们的库

动态库

站在建立者的角度

动态库和静态库类似,大的步骤都差不多,但是比静态库复杂了一些,它的优点是大大节省的空间的开销

动态库使用的是gcc 指令,可以这么说,动态库是gcc的亲儿子,静态库是表的

#include"myprint.h"voidprint(constchar*str){printf("%s\n",str);}
#include"mystdio.h"intAdd(intx,inty){returnx+y;}
#include"mystdio.h"#include"myprint.h"intmain(){printf("1 + 1 = %d\n",Add(1,1));print("hello linux!\n");return0;}

一个一个去写指令还是太麻烦了,可以使用makefile工具

libdi.so:mystdio.o myprint.o gcc-shared mystdio.o myprint.o-o libdi.so mystdio.o:mystdio.c gcc-fPIC-c mystdio.c-o mystdio.o myprint.o:myprint.c gcc-fPIC-c myprint.c-o myprint.o.PHONY:clean clean:rm-rf mystdio.o libdi.so lib.PHONY:output output: mkdir-p mylib/lib mkdir-p mylib/includecp*.so./mylib/libcp*.h./mylib/include

站在使用者角度

方法一:
将库文件和头文件拷贝到 根目录下,这里步骤和静态库一样

方法二:就是具体指定库目录和头文件

运行

这里报错了,原因是动态库也要进行运行,这里运行时找不到动态库

解决方法:
1、将库拷贝到 根目录 /lib64下,于运行方案1一样
2、制作软连接

这里千万注意,建立软连接时,不能使用相对路径,只能使用绝对路径!!!

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

调整DIFY回复节点中背景颜色的方法

在 DIFY 的回复节点中调整背景颜色为白色&#xff1a; 方法一&#xff1a;直接修改内联样式 如果你可以直接编辑 HTML 元素的内联样式&#xff0c;添加 background-color: white; 即可&#xff1a; <div class"reply-node" style"background-color: white…

作者头像 李华
网站建设 2026/6/13 18:44:26

全球10大最佳AIGC降重网站排名:免费与付费方案全面对比分析

&#xfffd;&#xfffd; 10大降AIGC平台核心对比速览 排名 工具名称 降AIGC效率 适用场景 免费/付费 1 askpaper ⭐⭐⭐⭐⭐ 学术论文精准降AI 付费 2 秒篇 ⭐⭐⭐⭐⭐ 快速降AIGC降重 付费 3 Aibiye ⭐⭐⭐⭐ 多学科论文降AI 付费 4 Aicheck ⭐⭐⭐⭐…

作者头像 李华
网站建设 2026/6/12 16:11:42

从0开始学目标检测:YOLOv9镜像轻松上手教程

从0开始学目标检测&#xff1a;YOLOv9镜像轻松上手教程 你是否曾为配置目标检测环境耗费一整天&#xff1f;装完CUDA又报错PyTorch版本不匹配&#xff0c;调通OpenCV却发现torchvision不兼容……最后连第一张检测图都没跑出来&#xff0c;就已身心俱疲。别担心——这次我们跳过…

作者头像 李华
网站建设 2026/6/14 7:52:36

提升开题报告效率的秘诀:9款人工智能辅助工具与模板调整技巧分享

工具对比速览 工具名称 核心功能 适用场景 效率评分 特色优势 AIBiYe 开题报告生成/降重 中文论文全流程 ★★★★★ 国内院校适配度高 AICheck 初稿生成/格式检查 快速产出框架 ★★★★☆ 结构化输出优秀 AskPaper 文献综述辅助 外文文献处理 ★★★★ 跨…

作者头像 李华
网站建设 2026/6/10 18:37:24

YOLOv9官方镜像使用心得:高效稳定的训练体验

YOLOv9官方镜像使用心得&#xff1a;高效稳定的训练体验 最近在多个目标检测项目中深度试用了 CSDN 星图提供的 YOLOv9 官方版训练与推理镜像&#xff0c;从零配置到完成 COCO 自定义子集的端到端训练&#xff0c;整个过程出乎意料地顺滑。没有反复重装 CUDA、不用手动编译 to…

作者头像 李华
网站建设 2026/6/14 13:39:38

2.4 Docker核心概念详解:镜像、容器、仓库三分钟彻底搞懂

2.4 Docker核心概念详解:镜像、容器、仓库三分钟彻底搞懂 引言 理解Docker的核心概念是掌握Docker的关键。镜像(Image)、容器(Container)和仓库(Repository)是Docker的三个核心概念。本文将用通俗易懂的方式解释这三个概念及其关系。 一、镜像(Image) 1.1 什么是镜…

作者头像 李华