电子产业一站式赋能平台

PCB联盟网

搜索
查看: 209|回复: 0
收起左侧

.a和.so库文件是什么?

[复制链接]

359

主题

364

帖子

2891

积分

三级会员

Rank: 3Rank: 3

积分
2891
发表于 2024-4-12 12:00:00 | 显示全部楼层 |阅读模式

3z3xv30vtbq640317913.gif

3z3xv30vtbq640317913.gif
3 c5 k2 C1 E' z6 L: V% h# c
点击上方蓝色字体,关注我们
4 J8 _% x4 U$ j4 I2 T& [% _. V8 E我们在编译开源代码后,通常会生成.a和.so这两个库文件,这两个文件有什么区别?又如何使用?& A" K0 L/ |+ ~1 W" d7 d

) Z' S: L2 g7 J9 I' u

kh41lesfndp640318013.png

kh41lesfndp640318013.png

& F( `# i. H7 x$ c% S: B& \' S! R# S0 I8 s; A8 U
在 Linux 中,.a 和 .so 文件都是库文件,但它们有一些区别:
5 \* \8 y! C  _9 g4 I# D
+ g, M% d& x' @5 ]1 b2 C5 K  J! o静态库文件(.a)3 C% t# ^; R  p4 r4 }- X  |& K" E
  • 静态库文件是编译后的目标文件的归档文件,其中包含了多个目标文件(通常是 .o 文件)的集合。这些目标文件被打包成一个单独的文件,以便在链接时使用。
  • 静态库文件中的代码会被完整地复制到最终的可执行文件中,因此最终的可执行文件会变得较大。
  • 静态库文件在链接时,链接器会将其中的目标文件整体复制到可执行文件中,因此可执行文件独立于库文件。这意味着在运行时,不需要库文件存在。: l5 E' a( w. ^4 b

      J# D2 N3 Q& k0 \3 M0 @共享库文件(.so)
    " H6 n" D/ q: p. r) t5 B1 E0 a
  • 共享库文件是编译后的目标文件的动态链接库文件,其中包含了可重用的函数和数据的集合。这些函数和数据在程序运行时会被动态加载到内存中。
  • 共享库文件中的代码不会被复制到最终的可执行文件中,而是在程序运行时由操作系统动态加载。
  • 共享库文件在链接时,链接器只会记录库文件的信息,而不会将库文件中的代码复制到可执行文件中。因此,可执行文件依赖于库文件,需要在运行时确保库文件存在。
    ' ^- j6 Q9 u6 W  @/ N; q
    5 Y+ u% _9 e" z( a! ?
    1
    , `7 c8 i8 a: [+ C$ v, v: \使用方法. J0 y$ Y! i4 D- @, u1 j5 c# ~
    1.1、静态库文件的使用' f, E0 n7 |* B4 ?/ p6 [9 b
    在编译时,通过 -l 选项指定要链接的静态库文件,例如 -lmylib 表示链接 libmylib.a 静态库文件。
    # E/ A- S$ b0 }. }6 E! I& x3 I7 ?* t8 ?, f  R" ~! N6 M+ l
    静态库文件通常在编译时直接链接到可执行文件中,因此不需要在运行时担心库文件的位置。
    * u: j9 r9 e5 N% j' _2 q+ M, C* I) u
    . M. H9 ~% l2 T
    - w6 G) m5 Q  s: o. p8 i
    1.2、共享库文件的使用# k* s$ d3 t4 ~: k, ^3 T, U( K
    在编译时,通过 -l 选项指定要链接的共享库文件,例如 -lmylib 表示链接 libmylib.so 共享库文件。
    7 H. F( ^. t% Z0 |9 h+ _8 y" v$ v$ h2 \7 S
    在运行时,程序需要知道共享库文件的位置。可以通过以下几种方式之一实现:9 @$ `6 C1 @8 [, J  P6 [! Q
  • 将共享库文件放置在默认的库搜索路径中,例如 /usr/lib、/usr/local/lib 等。
  • 将共享库文件所在目录添加到 LD_LIBRARY_PATH 环境变量中,例如 export LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATH。
  • 在程序中使用 ldconfig 或 LD_PRELOAD 等机制来指定共享库文件的位置。
    7 ]" c9 ^9 z6 k+ s: [- |
    : K# O, w) d. T3 o) [! `* {+ o8 i: v: a" V
    2; ?$ _# H1 z, p# ~  ^
    区别
      k4 \, V/ k$ B+ j/ e# [1 U$ k主要区别在于静态库文件的代码在编译时被复制到可执行文件中,而共享库文件的代码在运行时由操作系统动态加载。这导致了静态库文件的可执行文件会更大,而共享库文件的可执行文件则会更小。1 B  ?2 V! }8 p4 i& R6 D

    : ?' B0 c3 P& L2 R静态库文件使得可执行文件与库文件完全独立,但也导致了可执行文件的体积较大。而共享库文件可以被多个程序共享,因此节省了磁盘空间,并且使得系统中的程序能够共享相同的库,但会增加对库文件位置的依赖。
    ! _' y* A/ ~. ?( X) e, n- S; w0 g/ t; t6 u

    lwecjiv1mc5640318113.jpg

    lwecjiv1mc5640318113.jpg
    3 M5 U( Q6 R- C; O0 z

    qq3ux5inhj4640318213.gif

    qq3ux5inhj4640318213.gif
    ( m: @' W0 o4 B; J' P1 {
    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表