目录
一、什么是动态库和静态库
动态库
静态库
二、用gcc生成动态库和静态库
编辑生成例子程序
将hello.c文件编译成hello.o文件
创建静态库
在程序中使用静态库
由hello.o文件生成动态库文件
在程序中使用动态库
三、实例
题目要求
完成步骤
四、总结
一、什么是动态库和静态库
静态库
静态库即静态链接库。之所以叫做静态,是因为静态库在编译的时候会被直接拷贝一份,复制到目标程序里,这段代码在目标程序里就不会再改变了。静态库的好处很明显,编译完成之后,库文件实际上就没有作用了。目标程序没有外部依赖,直接就可以运行。当然其缺点也很明显,就是会使用目标程序的体积增大。
动态库
动态库即动态链接库。与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。动态库的优点是,不需要拷贝到目标程序中,不会影响目标程序的体积,而且同一份库可以被多个程序使用(因为这个原因,动态库也被称作共享库)。同时,编译时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码。动态库带来的问题主要是,动态载入会带来一部分性能损失,使用动态库也会使得程序依赖于外部环境。如果环境缺少动态库或者库的版本不正确,就会导致程序无法运行。
二、用gcc生成动态库和静态库
编辑生成例子程序
先分别编辑三个需要的程序hello.h,hello.c,main.c
将hello.c文件编译成hello.o文件
无论静态库还是动态库,都是由.o文件创建的。所以必须通过gcc将源程序hello.c文件编译成hello.o文件,在系统提示符的命令下即可得到。
输入指令gcc-c hello.c
运行IS命令查看是否生产了hello.o文件
运行结果如下:
创建静态库
静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。创建静态库用ar命令。在系统提示符下键入以下命令将创建静态库文件libmyhello.a。输入指令ar-crv libmyhello.a hello.o。再运行指令IS即可得到结果。
在程序中使用静态库
问:静态库制作完成后,如何使用其内部的函数呢?
答:只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库名,gcc将会从静态库中将公用函数连接到目标文件中。
在 main.c
中,我们包含了静态库的头文件 hello.h
,然后在主程序 main 中直接调用公用函数 hello。下面先生成目标程序 hello,然后运行 hello 程序。
具体方法如下:
由hello.o文件生成动态库文件
动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀 lib,但其文件扩展名为.so。 例如:我们将创建的动态库名为 myhello,则动态库文件名就是 libmyhello.so。
用 gcc来创建动态库:键入以下命令得到动态库文件 libmyhello.so
gcc -shared -fPIC -o libmyhello.so hello.o
使用 ls 命令查看动态库文件是否生成,实际运行结果如下所示:
得到了动态库文件 libmyhello.so
在程序中使用动态库
在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含
这些公用函数的原型声明,然后在用 gcc 命令生成目标文件时指明动态库名进行编译。
我们运行 gcc 命令生成目标文件,再运行它观察结果。
三、实例
题目要求
1)编写一个主程序文件main.c 和两个子程序文件 sub1.c,sub2.c,
要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b),此函数功能为对两个输入整型参数做某个运算,将结果做浮点数返回;再扩展写一个x2y函数(功能自定);
main函数代码将调用x2x和x2y ;返回结果printf出来。
2)将这3个函数分别写成单独的3个 .c文件,并用gcc分别编译为3个.o 目标文件;
将x2x、x2y目标文件用 ar工具生成1个 .a 静态库文件, 然后用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序,记录文件的大小。
3)将x2x、x2y目标文件用 ar工具生成1个 .so 动态库文件, 然后用 gcc将 main函数的目标文件与此动态库文件进行链接,生成最终的可执行程序,记录文件的大小,并与之前做对比。
完成步骤
利用vim文本编辑器编辑需要的文件sub1.c,sub2.c,sub.h,main.c
键入以下命令将三个.c文件编译成.o文件
gcc -c sub1.c
gcc -c sub2.c
gcc -c main.c
生成了sub1.o,sub2.o,main.o文件。
将两个目标文件用 ar 工具生成 .a 静态库
ar -crv libsub.a sub1.o sub2.o
运行之后即可得到结果
四、总结
本次主要学习了使用gcc创建与使用静态库和动态库,虽然整个过程遇到了很多困难,但在请教了老师和同学之后有了明显的进步,对动态库和静态库的原理以及生产过程都有了更加深刻的认识。