首页 > 代码库 > Linux下 静态链接库 和 动态链接库
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 __cplusplus14 }15 #endif16 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 __cplusplus21 }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: 最好将自己要用的动态链接放到系统默认的库目录下,否则运行目录没有相应的库文件会报错。
动态库优点在于,生成的目标更小;当库文件更新时,只要原来用到的符号地址不变,目标可以继续运行,并且伴随着库一起更新。这样动态库的更新可以与目标的更新相互独立进行。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。