首先看看静态库和动态库的定义
linux下的库有两种:静态库和共享库(动态库)。
二者的不同点在于代码被载入的时刻不同。
静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。
共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
下面通过一个实例来说明一下静态库和动态库的区别。
构建程序,最简单的hellworld,其目录结构如下:
test
--hello.h
--hello.c
--test.c
各文件代码如下:
hello.h
void hello(void);
hello.c
#include "hello.h"
void hello(void)
{
printf("Hello World\n");
}
test.c
#include "hello.h"
int main(void)
{
hello();
return 0;
}
下面我们就分别做成静态库和动态库。
1. 静态库的制作
# gcc -o hello.o -c hello.c //编译
# ar cqs libhello.a hello.o //本步骤生成静态库
经过上述的步骤后,将会生成libhello.a的静态库。
下面编译test.c文件。
# gcc test.c libhello.a -o test
经过编译后,生成名为test的可执行文件,下面我们用ldd命令来看一下它的引用情况。
# ldd test
libc.so.6 => /lib64/libc.so.6 (0x00000032a0e00000)
/lib64/ld-linux-x86-64.so.2 (0x00000032a0a00000)
2. 动态库的制作
# gcc -fPIC -o hello.o -c hello.c
# gcc -shared -Wall -fPIC -o libhello.so hello.o //本步骤生成动态库
经过上述的步骤后,将会生成libhello.so的静态库。将libhello.so拷贝到/usr/lib/目录下。
# cp libhello.so /usr/lib/
下面编译test.c文件。
# gcc test.c -lhello -o test1
经过编译后,生成名为test1的可执行文件,下面我们用ldd命令来看一下它的引用情况。
# ldd test1
libhello.so (0x00002b67c9237000)
libc.so.6 => /lib64/libc.so.6 (0x00000032a0e00000)
/lib64/ld-linux-x86-64.so.2 (0x00000032a0a00000)
看到区别了吧,是不是比静态链接的程序多了一个 libhello.so ?
这就是静态与动态的最大区别,静态情况下,他把库直接加载到程序里。
而在动态链接的时候,他只是保留接口,将动态库与程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。
分享到:
相关推荐
### Linux静态库与动态库详解 #### 一、引言 在Linux环境下,库是一种重要的软件组件,用于封装一组相关的函数或数据结构,以便于在不同的应用程序之间共享代码。库通常分为两大类:静态库(static libraries)和...
文档介绍了linux下静态库和动态库生成以及使用问题。文档介绍了linux下静态库和动态库生成以及使用问题。
这些资料将帮助你深入理解和掌握Linux环境下的动态库和静态库的运用。 总之,Linux的动态库和静态库是程序开发的重要组成部分,它们提供了代码复用的方法。了解并熟练掌握它们的创建和使用,将对提升开发效率和优化...
### Linux静态库与动态库详解 #### 基本概念 **库的定义与作用**:库,实质上是预编译的代码集合,旨在提供重复使用的功能或服务,简化软件开发过程。无论是在Windows还是Linux平台,库的存在极大地提高了编程效率...
Linux 下 g++ 编译与使用静态库和动态库 Linux 下 g++ 编译与使用静态库和动态库是 Linux 开发...静态库和动态库都是 Linux 下常用的库文件类型,它们的生成和使用方法有所不同,了解它们的区别和使用方法非常重要。
本文详细介绍了linux下的静态库与动态库的区别,适合于那些对静态库和动态库分不清楚的同学,以及那些想要自己研究如何生成动态库的同学
Linux下静态库和动态库的制作和使用,给新手一个自己了解并制作的指南与指导
在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成...
linux静态库和动态库制作归纳文档,详细编辑制作流程,清晰的思路。
关于库的测试代码,使用静态库动态库 解压工具tar
在Linux操作系统中,库文件是...总之,理解Linux下的静态库和动态库以及如何生成和使用它们对于进行系统级编程和软件开发至关重要。选择静态库或动态库取决于需求,如资源限制、程序部署的便捷性以及库更新的需求等。
7. **动态库与静态库的区别**:动态库在运行时由操作系统加载,减少了应用程序的大小,但依赖于系统的环境。静态库则将库代码直接编译进应用程序,无需运行时依赖,但可能导致应用程序体积增大。 Boost库包含的组件...
### Linux下Gcc生成和使用静态库和动态库详解 #### 一、基本概念 **1.1 什么是库** 库本质上是一种可执行代码的二进制形式,它可以被操作系统载入内存执行。无论是Windows还是Linux平台,都广泛地使用着库。然而...
通过上述步骤,我们不仅了解了如何在Linux环境中创建和使用静态库与动态库,还学习了它们之间的主要区别: - **静态库**:在编译时会被链接到最终的可执行文件中,因此一旦程序被编译完成,就不需要依赖外部的库...
接着,我们来讨论静态库和动态库的区别。静态库(.a文件)在编译时会被直接链接到目标程序中,形成一个单独的可执行文件,不依赖外部库。这意味着程序体积可能会增大,但避免了运行时因找不到库文件而引发的问题。...
这些是Linux下静态库和动态库的基本操作和概念,理解它们对于进行Linux系统开发和维护至关重要。在实际工作中,开发者需要根据项目需求和资源限制选择合适的库类型,并妥善处理库的路径和依赖问题。
Linux 使用 GCC 生成静态库和动态库 在 Linux 系统中,使用 GCC 编译器可以生成静态库和动态库。静态库和动态库是两种不同的库类型,它们的主要区别在于代码被载入的时间不同。 静态库是在编译时被载入到可执行...
本篇将详细介绍在Linux环境下如何编译动态库和静态库。 首先,我们来看动态库的生成过程。动态库的编译通常分为两个步骤: 1. 编译源文件为`.o`对象文件: 使用`cpp`或`gcc`命令,加上`-c`选项来编译源代码,并...
Linux 下编译静态库和动态库 Linux 下编译静态库和动态库是 Linux 开发中非常重要的一部分。静态库和动态库都是库文件,但是它们的使用方式和特点不同。下面我们将详细介绍 Linux 下编译静态库和动态库的过程。 一...