如何封装C语言静态库和动态库
库是包含一组目标文件的文件,目标文件从对应的源文件编译得到,比如s1.c编译得到s1.o,s2.c编译得到s2.o等,而s1.o与s2.o殪讧唁跬等聚合成库。对C语言来说,目标文件中包含了若干数据结构与函数,但不能包含main函数。库有静态库与动态库之分。静态库对应静态链接,即编译器将源文件编译成目标文件,然后与连接静态库合并成一个可执行文件。动态库对应动态链接,与静态链接区别在于,动态链接不合并动态库,动态库加载在程序执行时完成,这样就可以共享一份代码,也就是说动态库只有一份,静态库被拷贝了多份。本文首先以gcc生成库为例,展示库的本质,然后以Code::Blocks为例展示IDE如何进行库生成。
工具/原料
gcc
Code::Blocks
1、用gcc生成C语言静态库
1、准备两个源文件s1.c、s2.c,以及相应的头文件s1.h、s2.h。
2、从s1.c和s2.c生成静态库libs12.a:(1)执行指令“gcc -c s1.c s2.c”生成目标文件:s1.o、s2.o(2)执行指令“ar cr libs12.a s1.o s2.o”生成静态库:libs12.a
3、准备测试文件main.c并编译连接静态库libs12.a(1)执行指令“gcc -c main.c”生成目标文件:main.o(2)执行指令“gcc -o s12.exe main.o libs12.a”生成可执行文件s12.exe(3)执行生成的s12.exe可验证成功连接静态文件
2、用gcc生成C语言动态库
1、使用上一步的源文件s1.c、s2.c、s1.h、s2.h以及测试文件main.c
2、使用上一步用“gcc -c s1.c s2.c”生成的目标文件s1.o、s2.o,执行指令“gcc -fPIC -shared -o libs12.so”生成动态库:lib12.so对比发现,源文件相同,动态库文件比静态库文件要大得多。
3、使用上一步用“gcc -c main.c”生成测试用目标文件main.o,执行指令“gcc -o s12_so.exe main.o libs12.so”生成可执行文件s12_so.exe对比可知,源文件相同,动态连接生成的可执行文件要比静态连接的要小(因测试代码简单,所以小得有限),而动态库要大。
3、用Code::Blocks生成库
1、IDE生成库可选择相应的项目模版,如下图所示,生成静态库。可以发现,IDE生成静态库操作与前述手工操作并没有本质上的区别,只不过是模版化、可视化了。
2、Code::Blocks生成动态库如下图所示,选择动态库项目模版。同样,IDE生成动态库操作与手工操作没有本质区别,如下图所示。