之前编写一类功能,封装fun.c fun.h文件放在同一个目录下面,然后在mian.c文件里 include "fun.h"。以为这样就叫做使用库,其实不然。这样的方式仅仅编写了库的源码,而没有生成库文件。什么意思呢?

如果仅编写源码,然后引用。这样只相当于是把源码复制大man.c文件中,把所有代码链接到了一起。实际上效率没有提高。

 

如果将库的源码生成库文件(有静态库和动态库两种区别),然后再编译时引用,这样提高了代码的复用,效率也提升了。另外一个使用库的好处是,安全。因为库生成之后,不重新生成,它不变;而引用源码,稍加不注意,把源码改了,你的代码就出问题了。

为什么说,include <xxx.h> 是引用库,而 include "xxx.h"不是呢?

通常引用官方库(C库),这个会去链接c标准库,比较特殊。它自动给链接,而不用手动。
 

 

Linux - gcc静态库和动态库的创建过程

静态库 
在链接时,复制代码段。运行时无需加载。故运行速度快;但是占用空间大。

gcc -c hello.c -Wall     正常编译库
ar crs libhello.a hello.o 创建静态库
gcc -o test test.c -L. -lhello 编译时引用静态库(主c源文件里要进行函数声明)

动态库
不占用库中代码段的大小,且可以多个进程共享一个库;运行时需要动态加载。好处是,更新方便。

gcc -c -fPIC hello.c bye.c -Wall 编译库时要使用 -fPIC <程序无关 参数>
gcc -shared -o libcommon.so.1 hello.o bye.o  创建动态库
ln -s libcommon.so.1 libcommon.so     添加软链接
gcc -o test test.c -L. -lcommon  编译时引用动态库(主c源文件里要进行函数声明)