基于Linux,看清C++的动态库和静态库
动态库和静态库是Linux编程中常用的两种库类型,它们在编译、链接和运行时的行为上存在本质区别,适用于不同的应用场景。本文将详细讲解静态库和动态库的本质区别、应用场景,以及如何通过示例代码、制作和应用动态库及静态库来理解它们的使用。
一、静态库和动态库的本质区别
1. 静态库(Static Library)
静态库是编译时将库的代码直接链接到可执行文件中。程序运行时不再依赖外部的库文件。
- 优点:
- 程序体积较大,但运行时不需要额外加载库文件,启动速度较快。
- 适用于对程序体积和启动速度有较高要求的场景,如嵌入式系统。
- 缺点:
- 占用空间较大,因为每个程序都包含完整的库代码。
- 更新库时需要重新编译所有依赖该库的程序。
2. 动态库(Dynamic Library)
动态库在程序运行时才加载库代码。动态库的代码不会被嵌入到可执行文件中,而是以独立的共享库文件(如.so
文件)的形式存在。
- 优点:
- 程序体积较小,多个程序可以共享同一个动态库。
- 动态库可以独立更新,无需重新编译所有依赖程序。
- 缺点:
- 程序启动时需要加载动态库,可能会增加启动时间。
- 动态库需要随程序分发,否则程序无法运行。
二、应用场景的区别
1. 静态库适用场景
- 程序需要独立运行,且不依赖外部环境(如嵌入式系统)。
- 程序需要快速启动,且对体积要求不高。
- 库代码不需要频繁更新。
2. 动态库适用场景
- 多个程序共享同一个库文件。
- 库代码需要频繁更新(如系统库、第三方库)。
- 程序需要跨平台或跨版本兼容。
三、示例代码:GuoYao调用YongYong
1. 静态库示例
静态库代码(yongyong.c) :
#include <stdio.h>void yongyong_function() {printf("This is YongYong's function in static library!\n");
}
主程序代码(guoyao.c) :
#include <stdio.h>void yongyong_function();int main() {printf("GuoYao is calling YongYong's function...\n");yongyong_function();return 0;
}
编译和链接命令:
# 生成静态库
ar rcs libyongyong.a yongyong.o# 编译并链接
gcc guoyao.c -L. -lyongyong -o guoyao_static
运行程序:
./guoyao_static
输出:
GuoYao is calling YongYong's function...
This is YongYong's function in static library!
2. 动态库示例
动态库代码(yongyong.c) :
#include <stdio.h>void yongyong_function() {printf("This is YongYong's function in dynamic library!\n");
}
主程序代码(guoyao.c) :
#include <stdio.h>void yongyong_function();int main() {printf("GuoYao is calling YongYong's function...\n");yongyong_function();return 0;
}
编译和链接命令:
# 生成动态库
gcc -shared -fPIC yongyong.c -o libyongyong.so# 编译并链接
gcc guoyao.c -L. -lyongyong -o guoyao_dynamic
运行程序:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH # 设置动态库搜索路径
./guoyao_dynamic
输出:
GuoYao is calling YongYong's function...
This is YongYong's function in dynamic library!
四、制作动态库及应用动态库
1. 制作动态库
步骤:
-
编写动态库代码(如
yongyong.c
)。 -
使用
gcc
生成动态库:gcc -shared -fPIC yongyong.c -o libyongyong.so
-shared
:生成共享库(动态库)。-fPIC
:生成位置无关代码(Position Independent Code),适用于动态加载。
-
使用动态库:
gcc guoyao.c -L. -lyongyong -o guoyao_dynamic
-L.
:指定当前目录为库搜索路径。-lyongyong
:链接libyongyong.so
。
2. 运行动态库程序
- 确保动态库路径在
LD_LIBRARY_PATH
中:export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
- 运行程序:
./guoyao_dynamic
五、制作静态库及应用静态库
1. 制作静态库
步骤:
- 编写静态库代码(如
yongyong.c
)。 - 编译生成目标文件:
gcc -c yongyong.c -o yongyong.o
- 使用
ar
生成静态库:ar rcs libyongyong.a yongyong.o
ar
是静态库打包工具。-r
:替换现有文件。-c
:生成索引。
2. 应用静态库
步骤:
-
编写主程序代码(如
guoyao.c
)。 -
编译并链接:
gcc guoyao.c -L. -lyongyong -o guoyao_static
-L.
:指定当前目录为库搜索路径。-lyongyong
:链接libyongyong.a
。
-
运行程序:
./guoyao_static
六、总结
- 静态库适用于对启动速度和独立性要求较高的场景,但程序体积较大且更新不便。
- 动态库适用于需要共享库代码的场景,程序体积较小且支持动态更新。
- 在实际开发中,选择静态库还是动态库需要根据具体需求进行权衡。
通过本文的示例代码和制作流程,读者可以更直观地理解静态库和动态库的区别及应用场景。希望本文能够帮助开发者更好地掌握Linux编程中库的使用技巧。