C语言静态/动态链接库的用法小记
来源:互联网 发布:手机淘宝兼职赚钱 编辑:程序博客网 时间:2024/05/29 18:26
0x01 链接库的简单理解与编译
库文件简单了说就是包含了别人(或者自己)已经写好的代码,可以直接调用的其内部函数的文件。库文件又包含动态库文件和静态库文件。为什么有静态库和动态库的区别,我简单的介绍一下我所理解的什么是静态库,什么又是动态库。
静态库
Linux系统下后缀名为*.a
Windows系统下后缀名为*.lib
调用静态库,在编译器进行编译过程中,在有需要调用到库文件内部函数的地方,编译器会将静态库里的函数实现过程,拷贝到函数调用的地方。在编译好的程序运行时,不需要依赖库文件,可以独立运行。库文件对代码复用性很高,容易理解也容易使用,对提高开发速率有很大帮助,不需要自己造轮子。
Linux下生成静态库文件
$ gcc -c [FileName].c // 生成*.o文件$ ar -crv [FileName].a [FileName].o // 生成*.a文件
动态库
Linux系统下文件名格式为lib*.so
Windows系统下后缀名*.dll
上面介绍了静态库在编译过程中,编译器会将函数实现拷贝到可执行文件中,所以在程序运行时会占用一定的资源,造成资源浪费,而且在库文件的版本更新中,一点微小的改动,就需要对整个程序进行重新编译发布,在使用者使用过程中,这是得不偿失的。而动态库,则改进了静态库的这些缺点。简单介绍两个方面:
1、静态库在编译过程中不需要将代码编译到可执行程序中,在程序运行时需要调用的时候才加载。解决了在开发程序中使用静态库版本更新的问题,使用动态库不需要将自己编写的程序重新编译,更新库和更新程序是独立的两项任务。
2、可以实现库共享,不同程序的相同功能代码的实现可以只需要一份库文件提供调用,比如jpeg图像编码功能,很多程序都需要进行图像处理,简单的Logo头像的显示到复杂的平面设计,不同的软件可能使用的都是同一份库文件。
虽然动态库相对静态库优化了很多缺点,但并不是说可以完全不需要静态库。在内部开发的时候,两个同事对同一个项目的不同子功能进行开发,这些功能具有相互联系,但是又不希望对外部人员提供引用,在程序发布时,打包编译所有的代码实现都编译到程序中。
Linux下编译生成动态库文件
$ gcc -fPIC -c [FileName].c$ gcc -shared -o lib[FileName].so [FileName].o
也可以一句话编译
gcc -fPIC -shared [FileName].c -o lib[Name].so
0x02 库的编程使用
我主要使用简单的编程实例介绍动态库的使用,静态库的使用方法与之相同。
我所举的例子中编写了3份文件
1、libtest.c // 库函数实现,最终将此文件编译成库文件
2、test.h // 测试头文件,文件内只有一个结构体变量
3、main.c // 测试代码主函数的实现
ps: test.h头文件中只提供了一个结构体,库文件并不提供新的变量类型引用,新的变量一定需要定义
直接呈上代码
test.h:
/** test.h **/#ifndef TEST_H#define TEST_Htypedef struct { int a; char b;}Test_t;#endif
libtest.c:
/** libtest.c **/#include <stdio.h>#include <stdlib.h>#include "./test.h"int fun1(int a){ return a*2;}Test_t *fun2(Test_t a){ a.a++; a.b = 's'; Test_t *b = malloc(sizeof(Test_t)); *b = a; return b;}
很简单的内容,两个函数,fun1()和fun2()
先编译库文件 libtest.so
$ gcc -fpic -shared libtest.c -o libtest.so
main.c:
/** main.c **/#include <stdio.h>#include <stdlib.h>#include "./test.h"int main(){ //struct TEST_T A; Test_t A; A.a = 10; A.b = 'w'; printf("[init] Test.a = %d\t", A.a); printf("[init] Test.b = %c\n", A.b); printf("\n"); printf("[call] fun1() = %d\n", fun1(A.a)); printf("\n"); Test_t *B; B = (Test_t *)fun2(A); // 加强制转换 printf("[call] fun2().a = %d\n", B->a); printf("[call] fun2().b = %c\n", B->b); printf("\n"); free(B);}
编译主程序
$ gcc main.c -L./ -ltest -I./ -o main
0x03 测试
wangsansan@ubuntu$ ./main[init] Test.a = 10 [init] Test.b = w[call] fun_test() = 20[call] fun2_test().a = 11[call] fun2_test().b = swangsansan@ubunut$
最后上一张比较凌乱的组合图,有两个地方说明了一下。
个人微信公众号,比较懒更
- C语言静态/动态链接库的用法小记
- C语言使用动态链接库静态链接库
- 静态链接库和动态链接库的用法
- 深入理解C语言----动态库 & 静态库 & 链接
- ubuntu下用Gcc编译器编译c语言的静态和动态链接库范例
- linux下c语言编程,动态链接和静态链接的理解
- Linux C语言开发 动态链接库以及静态链接库编程简单介绍
- Linux环境下c语言静态链接库和动态链接库创建和使用
- C语言之静态链接库与动态链接库(1)
- C语言之静态链接库与动态链接库(2)
- Linux环境下c语言静态链接库和动态链接库创建和使用
- Linux环境下c语言静态链接库和动态链接库创建和使用
- 【C/C++】静态链接库、动态链接库、extern "C"
- C语言静态链接
- linux C编程入门之静态链接库、动态链接库的编译与链接
- 编译链接------Linux环境下c语言静态链接库和动态链接库创建和使用
- 编译链接------Linux环境下c语言静态链接库和动态链接库创建和使用
- cygwin c创建动态/静态链接库
- hdu6103(尺取)
- 1089: [SCOI2003]严格n元树
- 购物车中常用的全选与全不选
- C# WF 遍历获取容器内的子元素并进行重新排序
- 润乾报表下拉数据表异步加载
- C语言静态/动态链接库的用法小记
- 2017多校联合第六场1008/hdu 6103
- 数据泵EXPDP/IMPDP在12C版本的新特性-VIEWS_AS_TABLES
- web服务,如何在URL里去掉项目名称
- Apache POI Excel合并单元格
- mysql常见的面试题
- MySQL索引及查询优化书目录
- ORACLE内置函数大全补充(正则表达式函数)
- ActiveMQ与Spring的整合使用