参考链接
GCC生成动态链接库(.so文件):-shared和-fPIC选项
GCC创建和使用静态链接库(.a文件)
gcc的使用方法;动态编译和静态编译;Linux制作动态库和静态库
命名规则
静态库命名规则如下:
libxxx.o
lib:前缀
.o:静态库
动态链接库(shared object file,共享对象文件)命名规则如下:
libxxx.so
lib:前缀
.so:动态库
静态库参数
gcc 常用编译选项
动态库和静态库的对比
我们先来说一下静态库;
Linux下的静态库是以.a结尾的二进制文件,它作为一个程序的模块,它在链接期间就被组合到了程序中,比如说我有一个主程序mian.c,那么我把它和静态库链接的时候,它就直接把这个静态库组合到了我的main.c里面生成的一个二进制文件.a。
而与静态链接库相对的是动态链接库,同样的是把主函数mian.c和动态库进行链接,与静态库不同的是,这个动态库在程序运行的阶段才会被加载进内存,参与主函数运行
下面用几张图来说明一下:
还可以加上-static选项,让链接静态库后的math.out彻底的独立起来,“完全静态”,因此,得到的二进制文件会非常大。
使用静态/动态链接库的优缺点:
静态库:
编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
静态库的代码在编译时链接到应用程序中,因此编译时库文件必须存在并且需要通过“-L”参数传递给编译器,应用程序在开始执行时,库函数代码将随程序一 起调入进程内存段直到进程结束,其执行过程不需要原静态库存在。
动态库:
动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。
不同的INIX系统链接动态库方法,实现细节不一样,编译PIC型.o中间文件的方法一般是采用C语言编译器的-KPIC或者 -fPIC选项
最主要的是GCC命令行的一个选项:
-shared:该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类
型的导出符号) ,不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
制作链接库的目的(商业角度):
这就和商业项目挂钩了:
假如我们是一个项目的外包方,我们是有专利的,希望别人使用我们已经实现的功能,但又不希望别人看到我们的源代码,所以这对商业机构是非常友好的。
Makefile中的使用实例: