动态库和静态库

全文目录

  • 默认库文件路径
  • 静态库
  • 动态库
  • 为什么要有库

默认库文件路径

/usr/include 	# 默认的头文件搜索路径
/lib64 		# 默认的库文件搜索路径

LD_LIBRARY_PATH  	# 系统默认搜索路径的环境变量

将库文件拷贝到系统的默认路径下,叫做库的安装

默认使用动态库链接程序,可以使用-static指定使用静态库

静态库

静态库将代码之间拷贝进可执行程序中,在虚拟地址空间中直接标注库函数的实现等。

生成库文件:
ar -rc lib库名.a ***.o ***.o  	# 将多个***.o文件打包生成静态库  	
# ar是gnu归档工具,rc表示(replace and create)

链接在默认搜索路径下的静态库(C语言会自动连接libc.so这个库文件):
gcc main.c -lhello 		# 指定库链接
# -l是选项,hello是去掉前缀和后缀的库名

指定路径链接库和头文件:
gcc main.c -I 头文件路径 -L 库文件路径 -l库名
	-I 指定头文件路径
	-L 指定库文件路径
	-l 指定库名

动态库

生成与位置无关(通过相对路径进行定位)的目标文件:
gcc -fPIC -c ***.c -o ***.o 	

生成动态库:
gcc -shared ***.o ***.o -o lib库名.so

运行动态库链接的可执行程序是,需要告诉系统库目录:
	1. 将动态库拷贝到系统默认搜索路径下
	2. 将库所在路径导入系统默认搜索路径的环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:路径 	# 只在本次登录有效
/etc/ld.so.conf.d/		# 修改配置文件(永久有效),在该目录下创建文件,将路径写入文件即可

动态库与可执行程序分批加载,动态库加载时使用库的起始地址 + 函数偏移量的形式将各函数的地址存放在进程的堆栈之间的共享区中,并与页表建立映射关系。当有多个可执行程序使用同一个动态库时,只需要加载一份动态库。

为什么要有库

使用者的角度:

大大减少开发周期,提高软件的质量

作者的角度:

减少使用者的负担的同时保证了代码的安全

你可能感兴趣的:(Linux,Linux)