Linux下 静态链接库 和 动态链接库
先来说说C/C++编译过程
- 编译: 检查语句符号定义,将C/C++代码翻译生成中间语言。
- 链接: 将中间代码整合,生成可执行的二进制代码。
简单的说,库文件都是一种特殊的中间语言文件,静态库还是一种特殊格式的归档文件(打包的文件)。
使用静态库:
1. 先编写库函数
1 #ifndef _PRINT_TEST_H_ 2 3 #define _PRINT_TEST_H_ 4 #ifdef __cplusplus 5 extern "C" 6 { 7 #endif 8 9 extern int test_a; 10 extern void print_test(); 11 extern void print_data_a(); 12 13 #ifdef __cplusplus 14 } 15 #endif 16 17 #endif
1 #ifdef __cplusplus 2 extern "C" 3 { 4 #endif 5 6 #include <stdio.h> 7 8 void print_test() 9 { 10 printf("print_test\n"); 11 } 12 13 int test_a = 0; 14 void print_data_a() 15 { 16 printf("data in libtest test_a = %d\n", test_a++); 17 } 18 19 20 #ifdef __cplusplus 21 } 22 #endif
2. 主函数文件
1 #include "print_test.h" 2 3 int main() 4 { 5 print_test(); 6 print_data_a(); 7 print_data_a(); 8 print_data_a(); 9 print_data_a(); 10 print_data_a(); 11 return 0; 12 }
3. 编译库函数
4. 打包库
5. 编译主函数和运行
tips: 静态库文件命名通常以lib开头,链接库时直接 -l库名。
静态库的优点在于一次编译生成目标(main)后,这个目标是一个独立的二进制文件,而不用考虑其运行环境。
使用动态库
1. 编译库
ps: 很奇怪一点是,dltest.so被赋予了可执行权限。
2. 编译主函数
tips: 最好将自己要用的动态链接放到系统默认的库目录下,否则运行目录没有相应的库文件会报错。
动态库优点在于,生成的目标更小;当库文件更新时,只要原来用到的符号地址不变,目标可以继续运行,并且伴随着库一起更新。这样动态库的更新可以与目标的更新相互独立进行。