首先看看静态库和动态库的定义
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下静态库和动态库生成以及使用问题。文档介绍了linux下静态库和动态库生成以及使用问题。
Ubuntu linux动态库静态库的创建与使用附工程代码....
本文详细介绍了linux下的静态库与动态库的区别,适合于那些对静态库和动态库分不清楚的同学,以及那些想要自己研究如何生成动态库的同学
Linux下静态库和动态库的制作和使用,给新手一个自己了解并制作的指南与指导
linux静态库和动态库制作归纳文档,详细编辑制作流程,清晰的思路。
关于库的测试代码,使用静态库动态库 解压工具tar
linux下面的库文件有两种:静态链接库(xx.a)和动态链接库(xx.so)。 当一个程序使用静态链 接库,那么当link的时候,连接器会把所需要的函数拷贝到源程序里面,这样,当编译完以后,静态链接库就可以不需要了。如果...
简单的Linux下的静态库和动态链接库的编译方法和使用发发
Linux下Gcc生成和使用静态库和动态库详解Linux下Gcc生成和使用静态库和动态库详解
Linux系统下使用gcc 5.3编译器编译的boost库1.68版本的动态库和静态库,多线程参数编译,经测试可用
Linux静态库和动态库学习总结 静态库和动态库的比较 使用静态库动态库的方法
Linux 下 g++ 编译与使用静态库和动态库 Linux 下 g++ 编译与使用静态库和动态库是 Linux 开发...静态库和动态库都是 Linux 下常用的库文件类型,它们的生成和使用方法有所不同,了解它们的区别和使用方法非常重要。
新手入门很好用的:在Linux中创建静态库和动态库,例子和错误分析
Linux 如何使用gcc生成静态库和动态库,使用GCC编译生成静态库和动态库的方法
在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成...
默认编译是静态库,但考虑到 linux 上动态库使用较多,所以使用 -DBUILD_SHARED_LIBS=ON 参数编译为动态库。 在 centos 7 下使用 gcc 4.8.5 + cmake 3.16.9 编译,包含 bin, include, lib, lib64, share 五个目录,...
linux下用gcc生成静态库和动态库.doclinux下用gcc生成静态库和动态库.doclinux下用gcc生成静态库和动态库.doclinux下用gcc生成静态库和动态库.doclinux下用gcc生成静态库和动态库.doclinux下用gcc生成静态库和动态库...
linux下静态库及动态库的创建与使用.pdf
由于项目需要,花了一个星期研究,在64位linux下编译出来的cximage两个版本库,静态库以及动态库。亲测,在项目中运行可行