初识动静态库

黑苹果从入门到精通:最详细的VMware安装macOS教程 前言 不知为何,以前我发的两篇关于黑苹果的文章或没过审或被删除,最近SMZDM上有不少优质的黑苹果文章发出来,貌似禁令已开,前段时间在一篇写的很不错的黑果文章下吹牛说今年要写一个系列,故有了这篇文章作为系列的开头。 系列的名字起的有点俗,叫做xxx从入门到精通,但是我很喜欢,相信过半的黑果群众都是程序员,作为教程来说这个名字俗但是好用,我也希望这个系列能像其它入门到精通系列一样,让大家学到东西... 阅读详情

title: 初识动静态库
date: 2024-07-08 09:10:13
tags: 动态库 静态库
cover: https://picbed0521.oss-cn-shanghai.aliyuncs.com/blogpic/202409230827702.png

原文见我的网站: www.supdriver.top

静态库(.a)

程序在编译链接的时候把库的代码链接到可执行文件中。编译出的程序运行时不再需要静态库

生成和使用静态库

这里使用gcc编译获得.o链接文件,再用gnu归档工具中的ar指令配合-rc选项(replace and create)封装库文件,最后借助makefile简化文件目录的封装操作

使用第三方库时,还可以使用ar -tv查看库中的目录列表

  • t:列出静态库中的文件
  • v:verbose 详细信息

使用静态库:

gcc编译时使用第三方静态库必须包含以下选项:

  • -I指定头文件目录
  • -L指定库路径
  • -l指定库名(不加空格),库名要把文件名前面去掉lib,后面去掉.a才是真正的库名

否则编译器不知道头文件在哪,或者不知道链接哪个库

库搜索路径

库的搜索会按照一定的顺序

  1. 从左到右搜索-L指定的目录。
  2. 由环境变量指定的目录 (LIBRARY_PATH)
  3. 由系统指定的目录
    • /usr/lib
    • /usr/local/lib

样例

测试程序(共5个文件)

/////////////add.h/////////////////
 #ifndef __ADD_H__
 #define __ADD_H__ 
 int add(int a, int b); 
 #endif // __ADD_H__
 /////////////add.c/////////////////
 #include "add.h"
 int add(int a, int b)
 {
 return a + b;
 }
 /////////////sub.h/////////////////
 #ifndef __SUB_H__
 #define __SUB_H__ 
 int sub(int a, int b); 
 #endif // __SUB_H__
 /////////////add.c/////////////////
 #include "add.h"
 int sub(int a, int b)
 {
 return a - b;
 }
 ///////////main.c////////////////
 #include <stdio.h>
 #include "add.h"
 #include "sub.h"
 
 int main( void )
 {
 int a = 10;
 int b = 20;
 printf("add(10, 20)=%d\n", a, b, add(a, b));
 a = 100;
 b = 20;
 printf("sub(%d,%d)=%d\n", a, b, sub(a, b));
 }

然后我们编写makefile文件

lib = libmymath.a

$(lib):add.o sub.o 
	ar -rc $@ add.o sub.o 

add.o:add.c 
	gcc -c add.c -o add.o

sub.o:sub.c
	gcc -c sub.c -o sub.o

.PHONY:clean
clean:
	rm -f *.o *.a 

.PHONY:output 
output:
	mkdir -p lib/include
	mkdir -p lib/mymathlib
	cp *.h lib/include
	cp *.a lib/mymathlib

lib作为makefile中的变量,储存了库名,默认的make指令用于打包库文件,其依赖的add.o和sub.o会自动调用后两句编译产生。

make output指令自动准备好目录并拷贝头文件和静态库

然后编译产生可执行程序

gcc main.c -o mycmd -I ./lib/include -L ./lib/mymathlib -lmymath

注意,使用第三方库时-I,-L和-l缺一不可

但如果安装了第三方库时,即将库文件/库文件的软链接拷贝至/lib64/,将头文件/头文件的软链接拷贝至/usr/inlude/,使gcc能够自动搜索到路径,则编译时只需用-l指定库名即可

动态库(.so)

动态库的作用是使程序在运行时才去链接动态库的代码,多个程序共享使用库的代码,从而使编译出的可执行文件更小,节省磁盘空间。使用动态库时,动态库也要加载到内存中

使用动态库底层的过程

  1. 使用动态库编译可执行程序:一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
  2. 动态链接: 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制(加载)到内存中,这个过程称为动态链接(dynamic linking)
  3. 运行时调用动态库:调用来自动态库的函数时,实现函数功能的机器码将由动态库提供

生成和使用动态库

这里使用gcc加-fPIC(产生位置无关码position independent code)和-c编译获得.o链接文件,再用gcc指令配合封装库文件,最后借助makefile简化文件目录的封装操作

使用动态库:

gcc编译时使用第三方静态库必须包含以下选项:

  • -I指定头文件目录
  • -L指定库路径
  • -l指定库名(不加空格),库名要把文件名前面去掉lib,后面去掉.a才是真正的库名

否则编译器不知道头文件在哪,或者不知道链接哪个库

特别的,当动静态库同时存在时,gcc默认优先使用动态库,除非加-static参数

但是,仅仅编译出可执行文件还不够,因为可执行文件还找不到动态库,所以我们还得告诉系统中的加载器,我们的动态库在哪,所以我们要把动态库安装到/lib64/,拷贝文件或建立软连接都可以(需要sudo或root权限)

亦或者修改环境变量LD_LIBRARY_PATH

示例

文件代码同上,这里展示makefile文件

lib = mymathlib.a

$(lib):add.o sub.o 
	gcc -shared -o libmymath.so *.o 

add.o:add.c 
	gcc -fPIC -c add.c -o add.o 

sub.o:sub.c
	gcc -fPIC -c sub.c -o sub.o

.PHONY:clean
clean:
	rm -f *.o *.a 

.PHONY:output 
output:
	mkdir -p lib/include
	mkdir -p lib/mymathlib
	cp *.h lib/include
	cp *.so lib/mymathlib

库搜索路径

库的搜索会按照一定的顺序

  1. 从左到右搜索-L指定的目录。
  2. 由环境变量指定的目录 (LIBRARY_PATH)
  3. 由系统指定的目录
    • /usr/lib
    • /usr/local/lib

小结

库文件命名规则libxxx.a/libxxx.so

库文件名称->库名:去掉前缀lib,去掉后缀.so/.a

使用动态库的可执行程序需要安装动态库或修改环境变量LD_LIBRARY_PATH

ANSYS_APDL实战入门——从零开始掌握模态分析 本文为ANSYS APDL模态分析实战入门指南,通过一个悬臂梁案例,手把手教你从零开始掌握APDL命令流。内容涵盖从模型创建、材料定义、网格划分到边界条件设置、求解及后处理结果查看的全流程,帮助工程师快速上手结构动力学分析,避免共振风险。 阅读详情

相关推荐

等离子体密度诊断集

在实验上不仅要对带电粒子的分布和运动状态进行诊断,如电子温度、电子密度、电离温度等参数,还需要对等离子体中的中性粒子进行必要的实验测量,来获得有关物种的产生、能量分布以及各个激发态布居数分布等信息,如气体温度、转动温度、振动温度、激发温度等参数。

in546的博客 1351

【Linux】初识动静态库/动静态链接

初识静态库与动静态链接。

weixin_63449996的博客 889

【C++】auto关键字(C++11,超详细解析,小白必看系列)

本文详细解析了C++中的“auto”关键字,介绍了其定义、基本用法、限制和高级用法,特别是与范围for循环和Lambda表达式结合的应用。

m0_73494049的博客 6万+

【Linux初阶】基础IO - 动静态库 | 初识、生成、链接、加载

动静态库初识,库的含义,静态库的生成与链接,gcc/g++默认链接方式,动态库的生成与动态链接,查看动态链接的方法,动静态库的加载原理

Captain_ldx的博客 1010

STM32F030F4P6实战:LL库+DMA驱动WS2812全流程(附避坑指南)

本文详细介绍了如何使用STM32F030F4P6的LL库和DMA驱动WS2812 LED灯带的全流程,包括硬件选型、CubeMX配置、LL库与DMA关键实现、数据格式转换及调试技巧。特别提供了避坑指南,帮助开发者避免常见错误,提升开发效率。

weixin_29194693的博客 484

13、基于RBF的自适应鲁棒控制与反步控制方法及实现

本文介绍了基于RBF神经网络的自适应鲁棒控制与反步控制方法,详细阐述了控制系统的程序结构、核心算法及实现流程。通过Simulink搭建仿真系统,利用RBF网络逼近系统中的不确定非线性函数,并结合Lyapunov稳定性理论设计控制律,实现了对倒立摆等复杂非线性系统的高精度跟踪控制。文章还提供了完整的MATLAB/Simulink代码示例和仿真结果分析,验证了该方法的有效性与鲁棒性,为实际工程应用提供了可行的技术路径。

ol789012的博客 87

初识linux(16) 动静态库(手搓动静态库!)

手搓动静态库,并学习如何使用自己的库,如何加载第三方库,以及加载时会遇到的问题。文章内容较长,全是干货。

2301_79501467的博客 899

一文读懂AI协同办公领域发展和趋势

协同办公,又称OA,是指企业内部或外部各类人员之间利用信息技术来进行协作工作的一种形式。这种协作工作既可以由直接员工进行,也可以来自外部的咨询机构、合作伙伴或联营企业。协同办公的优势在于可以对资源进行有效管理和配置,各部门之间可以建立良好的协作关系,跨部门更好地实现资源共享。

女王の专属领地 2357

Linux :初识动静态库,条件编译以及怎么添加sudoer

接下来C语言诞生,C++诞生,java python等等各种语言,我们不能让每一种语言想办法直接转成二进制,所以我们就可以用这些新诞生的语言先转成汇编语言,然后再用汇编语言转换成二进制指令,因为汇编语言的编译已经很成熟了,就不用我们再给c转二进制做个东西,给c++转二进制做个东西了,相当于我们站在了前人的肩膀上来做这些东西。我们可以直接这样链接,但是真正的库是不会显示方法的内容的,它会把内容隐藏,所以实际上如果想真正模拟我们的库的话,我们需要的是.o文件,也就是二进制部分。

2301_81772249的博客 906

手把手教你学Simulink——机器人控制场景实例:基于Simulink的双足人形机器人步态生成与ZMP稳定控制仿真

ZMP是地面上合力矩在水平方向为零的点。对于平面行走: [ x_{\text{zmp}} = x_c - \frac{z_c}{g} \ddot{x}_c ]📌稳定性判据ZMP必须始终位于支撑脚的凸包(即脚掌范围内)本文完成了基于Simulink的双足人形机器人ZMP稳定控制仿真,实现了:✅ 基于LIPM生成稳定CoM轨迹✅ 构建ZMP参考与验证机制✅ 设计简化踝关节PD控制器✅ 验证ZMP始终位于支撑脚内 → 动态平衡✅ 为人形机器人步态规划奠定理论基础。

MHD0815的博客 138

【Altium Designer】Off grid pin解决方法

​今天我画完原理图编译时,出现了太多的黄色(出现warning警告提示)Off grid pin警告,这个警告并不是原理图电气连接出问题了,而是元器件或器件PIN脚没有和栅格对齐造成的原因。再编译还是出现这个警告。 最后经过不断翻阅网上经验和实践,才最终解决,本经验详细记录了解决该警告的有效方法。 解决方案:以下是问题解决步骤... ​

夜半少年的博客 7547

初识Linux · 动静态库(incomplete)

继上文,我们从磁盘的理解,到了文件系统框架的基本搭建,再到软硬链接部分,我们开始逐渐理解了为什么运行程序需要./a.out了,这个前面的.是什么我们也知道了。可是我们在文件权限部分,我们已经见识了最基本的库,知道了Linux的动态库的后缀是.so 静态库是.a,Windows系统的动态库是.dll,静态库是.lib。并且我们知道库的名字要去掉前缀,去掉后缀。这是我们最开始的对于库的认识。那么我们是否是否使用过库呢?

更新各种计算机技能~ 1590

【LSTM回归预测】attention机制LSTM时间序列回归预测【含Matlab源码 1992期】

attention机制LSTM时间序列回归预测 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2591

Linux -- 初识动静态库

为什么要有库、了解动态库、静态库

2301_76973016的博客 901

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【Linux】gcc/g++编辑器 && 初识动静态库 && 程序翻译过程

本文介绍了Linux下gcc/g++编译器的使用及程序的翻译过程,重点讲解了预处理、编译、汇编、链接四个阶段的功能和命令选项。文章详细解析了动静态库的区别:静态链接将库代码复制到可执行文件中,而动态链接仅在运行时加载共享库。通过示例对比了动静态链接生成文件的大小差异,并解释了动态库的共享特性和重要性。最后指出gcc默认采用动态链接,并强调了动态库在多程序共享中的优势及其不可缺失的特性。

分享学到的技术~~ 944

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

gcc && g++ && 编译 &&初识动静态库

摘要:本文介绍了编译过程的四个阶段(预处理、编译、汇编、链接)及GCC/G++编译器选项(-E、-S、-c)。重点对比了动态库和静态库的区别:动态库通过地址共享代码,仅加载一次到内存;静态库则拷贝到每个文件,可能造成内存浪费。编译命令示例包括从源代码到不同中间文件的转换(.i/.s/.o),最终生成可执行文件。(149字)

lst1314_520的博客 340

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Linux的学习日记:Linux基础开发工具(三):编译器gcc/g++以及初识动静态库

学会了用Vim编辑代码,下一步自然就是让代码运行起来。在Linux世界里,这离不开gcc和g++这两位“幕后英雄”。它们是如何工作的?本文将为你揭晓。本文到这也就结束了,本文的内容其实还是比较基础的,所以我相信各位掌握起来难度不大,其中我认为我动静态库讲解的并不是很好,如果读者没有读懂,欢迎私信咨询我,马上就国庆节了,这里我提前祝各位国庆节快乐,祝各位假期愉快~一起学习的时光总是短暂的,那么各位大佬们,我们下一篇文章见啦!

effort123_的博客 863

初识linux之软硬链接、动静态库和vscode与linux的远端链接

讲解了软硬链接、静态库、动态库的使用和vscode的安装及使用

Masquerena114514的博客 1382

Linux编译器-gcc/g++使用和初识动静态库(摆烂回来的第一天)

好久不见,我摆烂中又会来了~!

2302_80253411的博客 1125

Linux探秘坊-------3.开发工具详解(2)

这里%是通配符,:左边匹配所有.c结尾的文件,<表示将展开的所有.c文件,一个接一个地匹配命令。,⽽是在程序执⾏时由运⾏时链接⽂件加载库,这样可以节省系统的开销。之前我们在makefile里都是直接写文件名的,这里使用 类似宏替换。静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中。这句话表示,SRC拿到了当前目录里 所有以.c结尾的文件。,在编译链接时并 没有把库⽂件的代码加⼊到可执⾏⽂件中。这行表示OBJ是由SRC中 所有.c变为.o得来的。,但在运⾏时也就不再需要库⽂件了。

2301_80374809的博客 1084

深入浅出动静态库

当你在Linux系统上编写和运行程序时,动态库和静态库是两个非常重要的概念。它们不仅影响着程序的编译和执行效率,还直接关系到程序的可移植性和灵活性。

欢迎来到阿熊的blog~~ 1250

Linux 动静态库详解

预处理:完成头文件展开、去注释、宏替换、条件编译等,最终形成xxx.i文件。编译: 完成词法分析、语法分析、语义分析、符号汇总等,检查无误后将代码翻译成汇编指令,最终形成xxx.s文件。汇编: 将汇编指令转换成二进制指令,最终形成xxx.o文件。链接: 将生成的各个xxx.o文件进行链接,最终形成可执行程序。‌静态库‌:在编译时,库的代码被直接复制到可执行文件中,程序运行时不依赖外部库文件。‌动态库‌:在程序运行时加载库的代码,多个程序共享同一份库的实现,节省内存和磁盘空间。

w8848w的博客 1221

【Linux系统#8】动静态库(超详细)

本篇主要介绍了Linux系统中动静态库的基本原理、优缺点及使用方法。静态库不依赖外部文件,但会占用更多的磁盘和内存空间;动态库可以节省空间,但运行时必须依赖相应库文件。制作静态库使用ar命令,动态库则需-fPIC选项和-shared标志。使用库时需指定头文件路径、库文件路径和库名称。动态库运行还需确保库文件在系统路径或LD_LIBRARY_PATH中。

island1314的博客 1516

Linux 文件 IO 管理(第四讲:软硬链接和动静态库)

Linux 文件 IO 管理(第四讲:软硬链接和动静态库)

2302_77289177的博客 1101

【LINUX操作系统】 动静态库的链接原理

甚至,整个系统可以什么都不加载,只加载一个可加载程序ELF Header的entry部分。

2301_79501467的博客 778

[Linux系统编程——Lesson18.动静态库]

本文深入探讨了Linux环境下动静态库的制作与工作原理。文章首先通过实例解释了库的本质是预编译目标文件的集合,用于代码复用和共享。随后详细介绍了静态库(.a)和动态库(.so)的制作过程,包括编译选项(-fPIC)、打包命令(ar/gcc)和目录组织规范。在原理层面,重点分析了动态库的位置无关码(PIC)特性、运行时加载机制以及共享内存映射原理,解释了动态库如何通过"起始地址+偏移量"实现多进程共享。最后对比了动静态库在文件大小、内存占用、更新维护等方面的差异,并提供了三种动态库使用方法

2401_83386596的博客 1336
上一篇: Linux fork子进程,进程退出与等待
下一篇: Linux文件系统
supdriver
博客等级 码龄3年 192粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值