Linux下怎么创建动态库和静态库

本文详细对比了Linux环境下动态库与静态库的区别,包括它们在内存使用、加载时机、可移植性等方面的不同。介绍了如何在Linux下使用gcc生成和链接这两种库,以及动态库如何在多个程序间共享,节省空间。

前言

linux下的生成的动态库和静态库没有windows下方便
linux下gcc编译默认动态链接和release

程序运行后调用动态库

动态库:

程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码

可执行文件里包含的不是库,只是包含用到的函数入口地址一个表

一个动态库链接的可执行文件仅仅包含它用到函数的入口地址的一个表,而不是外部函数所在目标文件的整个机器码

什么加载到内存,准备运行之前

在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接

动态链接的好处

动态库可以在多个程序间共享,所以动态链接库使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存的磁盘空间

编译链接程序链接静态库

静态库:

程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不在需要静态库

生成静态库

1.创建四个文件

main.c add.c sub.c sub.h add.h

2.写好代码

3.然后分别生成 sub.o 和 add.o

gcc -c sub.c -o sub.o
gcc -c add.c -o add.o

4.将sub.o和add.o打包起来生成libmymath.a

ar -rc libmymath.a *.o

5.生成可执行文件a.out

gcc main.c -L. -I. -lmymath

生成动态库

1.用位置无关码生成sub.o和add.o

gcc -fPIC sub.c add.c

2.生成动态库

gcc -shared libmymath *.o

3.生成可执行文件main

gcc main.c -L. -I. -lmymath -o main

4.此时ldd发现main找不到动态库,要修改环境变量。

export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:yourpath

5.这个时候main找到了,完成

动态库和静态库比较

比较空间的占用

静态库–在程序编译链接的时候被链接到可执行文件中
动态库–是在程序运行之后才被加载到内存中,并且加载一个动态库可以供多个程序使用(虚拟内存机制)
动态库节约空间

时间效率

静态库–被链接到可执行文件中后就不再依赖动态库了
动态库–程序运行的时候还需要去内存中调用
静态库节约时间

可移植性

静态库–可执行文件生成后就不在依赖动态库
动态库–可执行文件生成后依然需要动态库,如果动态库没有了,程序不能正常执行。
动态库的可移植性差

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值