`

静态库和动态库的区别(linux下)

阅读更多

文件预览
文件目录树如下,如你所见,非常简单。
   1. libtest/
   2. |-- lt.c
   3. |-- lt.h
   4. `-- test.c
代码
#lt.c
   1. /* lt.c
   2. *
   3. */
   4.  
   5. #include  
   6.  
   7. void myprint(void)
   8. {
   9.   printf("Linux library test!\n");
10. }

# lt.h
   1. /* lt.h
   2. *
   3. */
   4.  
   5. void myprint(void);

#test.c
   1. /* test.c
   2. *
   3. */
   4.  
   5. #include "lt.h"
   6.  
   7. int main(void)
   8. {
   9.   myprint();
10.   return 0;
11. }


先看静态库
首先做成静态库 liblt.a 。
   1. $ gcc -o lt.o -c lt.c
   2. $ ar cqs liblt.a lt.o

再者,链接,
   1. $ gcc test.o liblt.a -o test

这个时候再来看他的引用库情况。
   1. $ ldd test
   2.         linux-gate.so.1 => (0xffffe000)
   3.         libc.so.6 => /lib/libc.so.6 (0xb7e29000)
   4.         /lib/ld-linux.so.2 (0xb7f6e000)

动态库
做成动态库 liblt.so 。
   1. $ gcc -o lt.o -c lt.c
   2. $ gcc -shared -Wall -fPIC -o liblt.so lt.o  

-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

-L.:表示要连接的库在当前目录中
-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。

链接方法I,拷贝到系统库里再链接,让gcc自己查找

   1. $ sudo cp liblt.so /usr/lib
   2. $ gcc -o test test.o -llt
这里我们可以看到了 -llt 选项,-l[lib_name] 指定库名,他会主动搜索
lib[lib_name].so。这个搜索的路径可以通过 gcc --print-search-dirs来查找。

链接方法II,手动指定库路径

   1. $ cc -o test test.o -llt -B /path/to/lib
这里的-B 选项就添加 /path/to/lib 到gcc搜索的路径之中。这样链接没有问题但是方法II中手动链接好的程序在执行时候仍旧需要指定库路径(链接和执行是分开的)。需要添加系
统变量 LD_LIBRARY_PATH :

   1. $ export LD_LIBRARY_PATH=/path/to/lib

这个时候再来检测一下test程序的库链接状况(方法I情况)
   1. $ ldd test
   2.         linux-gate.so.1 => (0xffffe000)
   3.         liblt.so => /usr/lib/liblt.so (0xb7f58000)
   4.         libc.so.6 => /lib/libc.so.6 (0xb7e28000)
   5.         /lib/ld-linux.so.2 (0xb7f6f000)

恩,是不是比静态链接的程序多了一个 liblt.so ?恩,这就是静态与动态的最大区别,静态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。
另外,运行时,要保证主程序能找到动态库,所以动态库一般发布到系统目录中,要么就在跟主程序相对很固定的路径里,这样不管主程序在本机何时何地跑,都能找得到动态库。而静态库只作用于链接时,运行主程序时,静态库文件没存在意义了。

分享到:
评论

相关推荐

    linux静态库和动态库

    ### Linux静态库与动态库详解 #### 一、引言 在Linux环境下,库是一种重要的软件组件,用于封装一组相关的函数或数据结构,以便于在不同的应用程序之间共享代码。库通常分为两大类:静态库(static libraries)和...

    linux 动态库静态库

    这些资料将帮助你深入理解和掌握Linux环境下的动态库和静态库的运用。 总之,Linux的动态库和静态库是程序开发的重要组成部分,它们提供了代码复用的方法。了解并熟练掌握它们的创建和使用,将对提升开发效率和优化...

    linux下g++编译与使用静态库和动态库

    Linux 下 g++ 编译与使用静态库和动态库 Linux 下 g++ 编译与使用静态库和动态库是 Linux 开发...静态库和动态库都是 Linux 下常用的库文件类型,它们的生成和使用方法有所不同,了解它们的区别和使用方法非常重要。

    linux下的静态库与动态库的区别

    本文详细介绍了linux下的静态库与动态库的区别,适合于那些对静态库和动态库分不清楚的同学,以及那些想要自己研究如何生成动态库的同学

    Linux下g++编译与使用静态库和动态库的方法

    在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成...

    Linux静态库和动态库

    **Linux库的分类**:Linux下的库主要分为两大类——静态库与动态库,它们的核心区别在于代码的加载时机。静态库在编译阶段即与目标程序结合,而动态库则是在程序运行时动态加载。 #### 静态库与动态库的生成与使用 ...

    boost库1.68版本Linux下编译的动态库和静态库

    7. **动态库与静态库的区别**:动态库在运行时由操作系统加载,减少了应用程序的大小,但依赖于系统的环境。静态库则将库代码直接编译进应用程序,无需运行时依赖,但可能导致应用程序体积增大。 Boost库包含的组件...

    linux下静态库和动态库问题

    文档介绍了linux下静态库和动态库生成以及使用问题。文档介绍了linux下静态库和动态库生成以及使用问题。

    cximage静态库 动态库 64位linux版本

    接着,我们来讨论静态库和动态库的区别。静态库(.a文件)在编译时会被直接链接到目标程序中,形成一个单独的可执行文件,不依赖外部库。这意味着程序体积可能会增大,但避免了运行时因找不到库文件而引发的问题。...

    Linux下Gcc生成和使用静态库和动态库详解

    ### Linux下Gcc生成和使用静态库和动态库详解 #### 一、基本概念 **1.1 什么是库** 库本质上是一种可执行代码的二进制形式,它可以被操作系统载入内存执行。无论是Windows还是Linux平台,都广泛地使用着库。然而...

    linux静态库和动态库制作归纳文档

    linux静态库和动态库制作归纳文档,详细编辑制作流程,清晰的思路。

    linux静态库与动态库

    在Linux操作系统中,库文件是...总之,理解Linux下的静态库和动态库以及如何生成和使用它们对于进行系统级编程和软件开发至关重要。选择静态库或动态库取决于需求,如资源限制、程序部署的便捷性以及库更新的需求等。

    Linux 如何使用gcc生成静态库和动态库

    Linux 使用 GCC 生成静态库和动态库 在 Linux 系统中,使用 GCC 编译器可以生成静态库和动态库。静态库和动态库是两种不同的库类型,它们的主要区别在于代码被载入的时间不同。 静态库是在编译时被载入到可执行...

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

    通过上述步骤,我们不仅了解了如何在Linux环境中创建和使用静态库与动态库,还学习了它们之间的主要区别: - **静态库**:在编译时会被链接到最终的可执行文件中,因此一旦程序被编译完成,就不需要依赖外部的库...

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

    这些是Linux下静态库和动态库的基本操作和概念,理解它们对于进行Linux系统开发和维护至关重要。在实际工作中,开发者需要根据项目需求和资源限制选择合适的库类型,并妥善处理库的路径和依赖问题。

    Linux编译动态库和静态库

    本篇将详细介绍在Linux环境下如何编译动态库和静态库。 首先,我们来看动态库的生成过程。动态库的编译通常分为两个步骤: 1. 编译源文件为`.o`对象文件: 使用`cpp`或`gcc`命令,加上`-c`选项来编译源代码,并...

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

    在Linux环境下,静态库和动态库是两种常见的链接库形式,它们分别在编译和运行阶段发挥着不同的作用。 **静态库**在程序编译过程中会被链接到目标代码中,也就是说,最终的可执行文件会包含静态库中被引用的所有...

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

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

Global site tag (gtag.js) - Google Analytics