首页 > 代码库 > Linux下 静态链接库 和 动态链接库

Linux下 静态链接库 和 动态链接库

  先来说说C/C++编译过程

  1.   编译: 检查语句符号定义,将C/C++代码翻译生成中间语言。
  2.   链接: 将中间代码整合,生成可执行的二进制代码。

  简单的说,库文件都是一种特殊的中间语言文件,静态库还是一种特殊格式的归档文件(打包的文件)。

  使用静态库:

  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 __cplusplus14 }15 #endif16 17 #endif 
print_test.h
 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 __cplusplus21 }22 #endif
print_test.c

 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 }
main.c

 3. 编译库函数

 

 4. 打包库

 5. 编译主函数和运行

 

tips: 静态库文件命名通常以lib开头,链接库时直接 -l库名

 静态库的优点在于一次编译生成目标(main)后,这个目标是一个独立的二进制文件,而不用考虑其运行环境。

使用动态库

1. 编译库

     ps: 很奇怪一点是,dltest.so被赋予了可执行权限。

2. 编译主函数

 

tips: 最好将自己要用的动态链接放到系统默认的库目录下,否则运行目录没有相应的库文件会报错。

动态库优点在于,生成的目标更小;当库文件更新时,只要原来用到的符号地址不变,目标可以继续运行,并且伴随着库一起更新。这样动态库的更新可以与目标的更新相互独立进行。