静态库和动态库的区别
文件预览
文件目录树如下,如你所见,非常简单。
1. libtest/
2. |-- lt.c
3. |-- lt.h
4. `-- test.c
#lt.c
1.
4.
5. #include
6.
7. void myprint(void)
8. {
9. printf("Linux library test!\n");
10. }
# lt.h
1.
4.
5. void myprint(void);
#test.c
1.
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和Unix下的静态库和动态库的创建和使用方法,对于进行系统级编程和软件开发至关重要。正确选择和管理库可以帮助优化程序性能,减少资源消耗,同时提高代码的复用性和维护性。
经常的,有朋友问到有关unix下面条是的技术。我整理了大多数的unix系统下面的常用的调试工具的调试技术的文章。希望对大家有所帮助。...另外静态库、动态库也是问的频率比较高的问题。在这里也做了总结。
UNIX系统开发-静态库和动态库的建立..doc
"最新版的 openssl 1.0,编译好的静态库和动态库" 提供的预编译库文件,对于开发者来说,可以节省在本地编译的时间和资源,方便快速地集成到项目中。尤其是对于不熟悉编译流程或者环境配置复杂的用户,这是一个非常...
在UNIX系统中,为了提高代码复用率和程序的维护性,开发人员常常需要创建静态库和动态库。本文将详细介绍这两种库的建立过程及其特点。 首先,让我们来看静态库的建立。静态库,又称档案库,是一个包含了多个目标...
库通常分为两种主要类型:静态库和动态库(共享库)。这两种库各有优缺点,适用于不同的场景。 静态库,通常以.lib文件格式存在,其特点是将库中的函数和数据直接嵌入到最终的可执行文件中。这意味着当编译程序时,...
在计算机编程领域,静态库和动态库是两种不同的库文件类型,它们在程序开发和运行时扮演着重要的角色。理解并正确使用这两种库是每个软件开发者必须掌握的基础知识。 首先,我们来了解一下静态库。静态库(Static ...
动态库(也称为共享库)和静态库是两种主要的链接类型。本示例聚焦于如何在`makefile`中处理这两种库的链接,这对于理解和创建复杂项目构建过程至关重要。 `makefile`是用于自动化构建项目的工具,它定义了规则来...
在这个`MAKEFILE(静态库,动态库,可执行文件)模板`中,我们将深入探讨如何使用 `Makefile` 来管理静态库、动态库和可执行文件的构建。 首先,我们要理解`Makefile`的基本结构。`Makefile`通常由一系列规则组成,...
首先,`pthread`库分为静态库和动态库两种形式。静态库(lib)将库函数链接到目标程序中,使得程序自包含,不依赖外部库文件。而动态库(dll)则是在运行时由操作系统加载,可以节省内存,但需要确保相应的dll文件在...
标题中的"Pthread 多线程C++动态库+静态库+头文件"指的是Pthread库在C++环境下的多线程应用,适用于Windows平台,并且兼容Visual Studio及MFC(Microsoft Foundation Classes)框架。Pthread,全称为POSIX Threads,...
`.a`文件(在Unix-like系统中)和`.lib`文件(在Windows中)是静态库的常见格式。 静态库的优点: 1. 独立性:生成的可执行文件不依赖外部库,便于分发和在没有特定库的环境中运行。 2. 稳定性:不会因库的更新而...
### 使用GCC建立并调用静态库与动态库 在软件开发过程中,经常需要将一些功能模块封装成库供多个程序共享...通过以上步骤,我们可以使用GCC成功地创建并调用了静态库和动态库,这对于软件开发来说是非常有用的技能。
### C/C++ 编译器和调试器以及静态库、动态库...总结来说,在Unix系统中,熟练掌握GCC/G++编译器、GDB调试器以及静态库和动态库的使用是非常重要的,这有助于提高程序的质量和性能,同时也是进行高效软件开发的基础。
接下来,我们讨论如何生成静态库和动态库。 1. 静态库:使用`add_library()`命令创建静态库。例如,如果有一个名为`mylib`的库,包含源文件`src/mylib.cpp`,CMakeLists.txt中应写入`add_library(mylib STATIC src/...
在编程世界中,静态库和动态库是软件开发过程中不可或缺的部分。它们允许程序员将已编译的代码片段封装起来,以便在多个项目中重复使用。本文将以“简单的静态库调用实例”为出发点,深入讲解如何创建和使用静态库,...
动态库与静态库的区别在于,静态库在编译时会被完全合并到目标程序中,而动态库则在运行时由操作系统加载。动态库的好处在于,系统只需要维护一份库的副本,多个程序可以共用,节省了内存资源。此外,更新动态库可以...
在C++编程中,静态库(Static Library)是一种编译时链接的方式,它将多个编译后的对象文件打包成一个库文件,供其他程序在编译时直接...在实际开发中,开发者需要根据项目的具体需求和环境选择使用静态库还是动态库。
与静态库(在编译时将库代码直接嵌入到应用程序中)不同,动态库在程序运行时才被加载到内存中。当多个程序都需要使用同一功能时,动态库可以避免重复加载相同的代码,从而减少内存占用。此外,如果动态库需要更新,...
Unix系统中的库分为静态库和动态库两种类型。静态库(.a文件)在编译时会被完全复制到可执行文件中,形成一个独立的二进制文件,不依赖于系统库。动态库(.so文件)则在运行时被加载,减少了磁盘空间占用,且便于多...