如何生成静态库与动态库?
库是由一组目标文件聚合而成的文件,目标文件通过源文件编译得到。对于C语言,目标文件包含了若干数据结构和函数,但不能包含main函数。库有两种类型:静态库和动态库。
静态库是指在编译时将库链接进可执行文件中,每次执行程序时都会使用这个库的一个副本。动态库则在运行时加载进内存,不会像静态库那样被复制多份,因此动态库可以被多个程序共享。本文将以gcc工具为例,介绍如何生成静态库和动态库。
一、如何生成静态库
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可验证成功连接静态文件
二、如何生成动态库
1. 从s1.c和s2.c生成动态库:
(1)执行指令“gcc -fPIC -shared s1.c s2.c -o ”生成动态库:
其中-fPIC选项用于告诉编译器生成与位置无关的代码,这对于动态库非常重要。
2. 编译测试文件main.c并链接动态库
(1)执行指令“gcc -c main.c”生成目标文件:main.o
(2)执行指令“gcc -o s12 main.o -L./ -l s12”生成可执行文件s12
其中-L选项用于告诉编译器在当前目录下查找动态库,-l选项则指定要链接的库的名称,注意此处不需要写上“lib”和“.so”后缀。
(3)执行生成的s12可验证成功连接动态文件
总结:
生成静态库和动态库的方法大致相同,只是在编译时需要加入不同的参数。静态库在编译时将库链接进可执行文件中,而动态库则在运行时加载进内存,两者各自的优点和缺点需要根据实际情况进行选择。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。