静态库与共享库详解
在开发和使用 C 语言编写程序时,库文件(Library)是一个重要的组成部分。库文件是目标文件的集合,可以被其他代码调用。将代码封装编译成库文件有助于简化使用、便于管理,并提高安全性和保密性。本文将详细介绍静态库和共享库(动态库),并演示如何创建和使用它们。
一、静态库
静态库(Static Library)通常以 .a
结尾,是一组目标文件的集合。当我们调用静态库时,库中的二进制指令会被复制到可执行文件中。
- 优点:
- 运行速度较快
- 可执行文件在运行时不依赖静态库文件
- 缺点:
- 可执行文件较大
- 如果静态库修改后,需要重新编译可执行文件
1. 创建静态库
- 编译生成目标文件
gcc -c code.c
- 打包目标文件生成静态库文件
ar -r libname.a aa.o bb.o cc.o...
- 注意:静态库文件名的前缀必须为
lib
,后缀必须为.a
。
- 注意:静态库文件名的前缀必须为
2. 使用静态库
- 直接使用静态库
gcc code.c libname.a
- 指定库文件的查找路径
使用-L
指定库的路径,使用-l
指定库名(去掉前缀lib
和后缀.a
)。gcc code.c -L /path -l name
- 通过环境变量指定库的默认查找路径
- 打开操作系统配置文件:
vim ~/.bashrc
- 在文件末尾追加:
export LIBRARY_PATH=$LIBRARY_PATH:/path
- 保存退出并重新加载配置文件:
source ~/.bashrc
- 之后可以使用以下命令编译程序:
gcc code.c -lname
- 打开操作系统配置文件:
二、共享库(动态库)
共享库(Shared Library,也称为动态库)通常以 .so
结尾。共享库类似于带入口的可执行文件,当程序运行时,共享库会被加载到内存中,并且可以通过函数名来访问共享库中的内容。
- 优点:
- 可执行文件较小
- 修改共享库后不需要重新编译可执行文件
- 缺点:
- 运行速度比静态库慢
- 可执行文件在运行时依赖共享库文件
1. 创建共享库
- 编译生成目标文件
使用-fpic
生成与位置无关的代码:gcc -fpic -c code.c
- 生成共享库
使用-shared
选项创建共享库:gcc -shared -fpic a.o b.o... -o libname.so
2. 使用共享库
- 编译时使用共享库
- 直接使用共享库编译
需要注意的是,这种方式只能编译成功,运行时还需要确保共享库在系统的默认路径中。gcc code.c libname.so
- 指定库文件的查找路径
gcc code.c -L /path -l name
- 通过环境变量指定库的默认查找路径
- 打开操作系统配置文件:
vim ~/.bashrc
- 在文件末尾追加:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path
- 保存退出并重新加载配置文件:
source ~/.bashrc
- 打开操作系统配置文件:
- 直接使用共享库编译
3. 运行可执行文件
运行可执行文件时,系统会从默认路径加载共享库。如果共享库不在默认路径中,需要通过设置 LD_LIBRARY_PATH
环境变量来指定共享库的加载路径。
三、注意事项
- 优先使用共享库:如果在同一目录下同时存在同名的共享库和静态库,编译器会优先使用共享库。
- 强制使用静态库:可以通过
-static
编译参数来强制使用静态库。
通过以上介绍,我们可以清楚地理解静态库和共享库的区别,以及如何在开发中灵活应用它们。根据项目需求选择合适的库类型,可以更好地优化程序的性能和管理方式。
标签:可执行文件,文件,gcc,code,静态,详解,共享 From: https://blog.csdn.net/m0_57538342/article/details/141255144