`
chriszeng87
  • 浏览: 741116 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

静态库和动态库的优缺点

阅读更多

一、库的类型

(一) 在windows中

.dll 动态库

.lib 静态库

库即为源代码的二进制文件

(二) 在linux中

.so 动态库

.a      静态库

 

(三) 静态库和动态库的优缺点

我们通常把一些公用函数制作成函数库,供其它程序使用。

函数库分为静态库和动态库两种。

静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在

 

1.什么是库

在windows平台和linux平台下都大量存在着库。

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。

由于windows和linux的本质不同,因此二者库的二进制是不兼容的。

本文仅限于介绍linux下的库

 

2.库的种类

linux下的库有两种:静态库和共享库(动态库)。

 二者的不同点在于代码被载入的时刻不同。

静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。

共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

 

3.库存在的意义

库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议。

现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。

 

4.库文件是如何产生的在linux下

静态库的后缀是.a,它的产生分两步

Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表

Step 2.ar命令将很多.o转换成.a,成文静态库

动态库的后缀是.so,它由gcc加特定参数编译产生。

例如:

$ gcc -fPIC -c *.c $ gcc -shared -Wl,-soname, libfoo.so.1 -olibfoo.so.1.0 *.

 

5.库文件是如何命名的,有没有什么规范

在linux下,库文件一般放在/usr/lib和/lib下,

静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称

动态库的名字一般为libxxxx.so.major.minor,xxxx是该lib的名称,major是主版本号, minor是副版本号

 

6.如何知道一个可执行程序依赖哪些库

ldd命令可以查看一个可执行程序依赖的共享库,

例如# ldd /bin/lnlibc.so.6

=> /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2

=> /lib/ld- linux.so.2 (0×40000000)

可以看到ln命令依赖于libc库和ld-linux库

 

7.可执行程序在执行的时候如何定位共享库文件

当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径

此时就需要系统动态载入器(dynamiclinker/loader)

对于elf格式的可执行程序,是由ld-linux.so*来完成的

它先后搜索elf文件的 DT_RPATH段—环境变量LD_LIBRARY_PATH—/etc/ld.so.cache文件列表—/lib/,/usr/lib目录

找到库文件后将其载入内存

 

8.在新安装一个库之后如何让系统能够找到他

如果安装在/lib或者/usr/lib下,那么ld默认能够找到,无需其他操作。

如果安装在其他目录,需要将其添加到/etc/ld.so.cache文件中,步骤如下

1.编辑/etc/ld.so.conf文件,加入库文件所在目录的路径

2.运行ldconfig,该命令会重建/etc/ld.so.cache文件

 

############################################################

 

 linux中编译静态库(.a)和动态库(.so)的基本方法

 

(四) 静态库

 

在linux环境中, 使用ar命令创建静态库文件.如下是命令的选项:

          d -----从指定的静态库文件中删除文件

          m -----把文件移动到指定的静态库文件中

          p -----把静态库文件中指定的文件输出到标准输出

          q -----快速地把文件追加到静态库文件中

          r -----把文件插入到静态库文件中

          t -----显示静态库文件中文件的列表

          x -----从静态库文件中提取文件

      还有多个修饰符修改以上基本选项,详细请man ar 以下列出三个:

          a -----把新的目标文件(*.o)添加到静态库文件中现有文件之后

          b-----***************************************之前

          v -----使用详细模式

ar 命令的命令行格式如下:

      ar[-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...

参数archive定义库的名称, files是库文件中包含的目标文件的清单, 用空格分隔每个文件.

 

比如创建一个静态库文件的命令如下:

      ar r libapue.a error.oerrorlog.o lockreg.o

这样就了libapue.a静态库文件, 可以用 t 选项显示包含在库中的文件

创建库文件之后,可以创建这个静态库文件的索引来帮助提高和库连接的其他程序的编译速度:

使用ranlib程序创建库的索引,索引存放在库文件内部.

      ranlib libapue.a

 

用nm程序显示存档文件的索引,它可以显示目标文件的符号

nm libapue.a | more

如果是显示目标文件的符号:

nm error.o | more

如何使用呢?如下所示:

gcc -o test test.c libapue.a

这样就可以在test.c中调用在libapue.a中的函数了.

 

 

(五) 动态库

 

1.创建共享库

     gcc -shared -o libapue.soerror.o errorlog.o

这样就创建了共享库!

2.编译共享库

    假设共享库位于当前目录(即跟程序文件相同的目录中)

gcc -o test -L. -lapue test.c

这样就编译出了不包含函数代码可执行文件了,但是但你运行时会发现linux动态加载器找不到libapue.so文件.

可以用ldd 命令查看可执行文件依赖什么共享库:

ldd test

如何才能让动态加载器发现库文件呢?有两种方法可以解决:

    1.环境变量

       exportLD_LIBRARY_PATH="$LD_LIBRARY_PATH:."

    2.修改/etc/ld.so.conf文件.

 

一般应用程序的库文件不与系统库文件放在同一个目录下,一般把应用程序的共享库文件放在/usr/local/lib下,新建一个属于自己的目录apue,然后把刚才libapue.so复制过去就行了

同时在/etc/ld.so.conf中新增一行:

/usr/local/lib/apue

 

以后在编译程序时加上编译选项:

-L /usr/local/lib/apue -lapue

 

/*

参数的配置通过mangcc可以看到

-llibrary

              连接名为 library 的 库文件.

              连接器 在 标准搜索目录 中 寻找 这个 库文件, 库文件 的 真正 名 字

 

分享到:
评论
4 楼 shilei0619 2013-05-21  
shilei0619 写道
chriszeng87 写道
shilei0619 写道
8错,
ps.卤煮,头像是谁,好可爱的胖纸~

一个已经去世的日本音乐人

谁啊

我好像找到了,Nujabes,默哀
3 楼 shilei0619 2013-05-21  
chriszeng87 写道
shilei0619 写道
8错,
ps.卤煮,头像是谁,好可爱的胖纸~

一个已经去世的日本音乐人

谁啊
2 楼 chriszeng87 2013-05-20  
shilei0619 写道
8错,
ps.卤煮,头像是谁,好可爱的胖纸~

一个已经去世的日本音乐人
1 楼 shilei0619 2013-05-20  
8错,
ps.卤煮,头像是谁,好可爱的胖纸~

相关推荐

    linux静态库和动态库

    库通常分为两大类:静态库(static libraries)和动态库(dynamic libraries)。这两种库各有其优势和适用场景,在开发过程中合理选择和使用它们对于提高程序性能和维护性至关重要。 #### 二、静态库 **静态库**主要在...

    VS2008静态库和动态库的创建和调用

    VS2008静态库和动态库的创建和调用是指在VS2008中创建和使用静态库和动态库的过程。静态库是一种编译后生成的库文件,可以被多个工程使用,而动态库则是一种在运行时加载的库文件,提供了更多的灵活性。 静态库的...

    静态库和动态库:.doc

    总结来说,静态库和动态库各有优缺点。静态库在编译时就包含在可执行文件中,不需要运行时额外的动态链接,但会使可执行文件变大;动态库在运行时被加载,可以节省磁盘空间和内存,但需要确保库文件在运行环境中可用...

    静态库和动态库_共享库

    库通常分为两种主要类型:静态库和动态库(共享库)。这两种库各有优缺点,适用于不同的场景。 静态库,通常以.lib文件格式存在,其特点是将库中的函数和数据直接嵌入到最终的可执行文件中。这意味着当编译程序时,...

    FFmpeg7.0 安卓静态库+动态库

    这个压缩包包含的是 FFmpeg 7.0 版本针对 Android 平台的静态库和动态库,这对于在 Android 应用中实现音视频的编码、解码、转码、流媒体等功能至关重要。 1. **FFmpeg 概述** FFmpeg 是一套跨平台的音视频处理...

    9.C++静态库和动态库1

    库分为两种主要类型:静态库和动态库。 静态库(如`.a`或`.lib`)在程序编译期间与其使用者的代码链接在一起,形成一个完整的可执行文件。这意味着,当编译器处理源代码时,它会将静态库中的函数和数据合并到最终的...

    动态库、静态库的创建与连接

    在这篇文章中,我们将详细介绍动态库和静态库的创建、连接方法及其优缺点。 一、静态库 静态库是一种链接库,它在编译时期将目标文件与库文件打包到可执行文件中。静态库的特点是: * 静态库对函数库的链接是放在...

    静态库和动态库的使用

    总结来说,静态库和动态库各有优缺点,开发者应根据项目需求选择合适的方式。静态库适合不需要频繁更新且对文件大小不敏感的项目,而动态库则适用于需要节省资源、模块化设计或跨程序共享代码的场景。了解和熟练运用...

    静态库_动态库生成过程及其调用方法详解

    总结来说,静态库和动态库各有优缺点。静态库适合于不需要在多处共享代码或对程序大小不敏感的情况,而动态库则适用于系统服务、插件开发等需要节省系统资源和更新灵活的场景。理解它们的工作原理和生成、调用方法,...

    关于Linux静态库和动态库的分析

    库分为静态库(.a)和动态库(.so),这两种库各有优缺点。静态库在编译时会被完整地集成到可执行文件中,因此生成的可执行文件体积较大,但运行时不再依赖外部库。动态库则在运行时加载,可以节省磁盘空间,但需要...

    openSSL头文件和静态库文件以及动态库

    OpenSSL是一个强大的安全套接字层(SSL)密码库,包含各种主要的密码...同时,理解静态库和动态库的区别,有助于你在不同场景下做出合适的选择。在项目开发过程中,确保所有依赖项完整无误,是保证程序正常运行的前提。

    动态库静态库测试依赖问题的demo

    本文将深入探讨动态库(Dynamic Library)和静态库(Static Library)的概念,以及它们在测试和依赖性方面的差异。我们将通过一个名为"lib_share_static"的示例来说明这些问题。 首先,我们来理解什么是动态库和...

    举例分析Linux动态库和静态库

    ### 举例分析Linux动态库和静态库 #### 静态库与动态库的基本概念 在Linux环境下,静态库和动态库是两种常见的链接库形式,它们分别在编译和运行阶段发挥着不同的作用。 **静态库**在程序编译过程中会被链接到...

    C++ protobuf debug release动态库和静态库

    标题 "C++ protobuf debug release动态库和静态库" 涉及的是Google的Protocol Buffers(简称protobuf)在C++中的应用,特别是如何构建和使用protobuf的动态库和静态库。Protocol Buffers是一种数据序列化协议,允许...

    在Linux中创建静态库和动态库

    ### 在Linux中创建静态库和动态库 #### 静态库与动态库的基本概念 在Linux环境下,库是预编译代码的集合,用于在链接阶段被其他程序使用。库分为两种类型:静态库(static libraries)和动态库(dynamic libraries...

    zip 1.2.7 静态库 动态库

    "zip 1.2.7 静态库 动态库"指的是用于处理ZIP文件格式的库,具体为版本1.2.7,同时提供了静态库和动态库两种形式。 **ZLIB库和ZIP文件格式** ZLIB库是由Jean-loup Gailly和Mark Adler开发的一个开源库,主要用于...

    Linux静态库和动态库学习总结

    这些库文件可以分为两大类:静态库(static libraries)和动态库(dynamic libraries)。本文将详细介绍这两种库的区别、它们各自的优缺点以及如何在实际开发中使用它们。 #### 二、库的基本概念 ##### 2.1 库的原则 ...

    Linux下编译静态库和动态库1

    Linux 下编译静态库和动态库 Linux 下编译静态库和动态库是 Linux 开发中非常重要的一部分。静态库和动态库都是库文件,但是它们的使用方式和特点不同。下面我们将详细介绍 Linux 下编译静态库和动态库的过程。 一...

Global site tag (gtag.js) - Google Analytics