动态编译和静态编译——制作动态库和静态库

参考链接

GCC生成动态链接库(.so文件):-shared和-fPIC选项
GCC创建和使用静态链接库(.a文件)
gcc的使用方法;动态编译和静态编译;Linux制作动态库和静态库

命名规则

静态库命名规则如下:
libxxx.o
lib:前缀
.o:静态库
动态链接库(shared object file,共享对象文件)命名规则如下:
libxxx.so
lib:前缀
.so:动态库

静态库参数

动态编译和静态编译——制作动态库和静态库_第1张图片

gcc 常用编译选项

动态编译和静态编译——制作动态库和静态库_第2张图片

动态库和静态库的对比

我们先来说一下静态库;
Linux下的静态库是以.a结尾的二进制文件,它作为一个程序的模块,它在链接期间就被组合到了程序中,比如说我有一个主程序mian.c,那么我把它和静态库链接的时候,它就直接把这个静态库组合到了我的main.c里面生成的一个二进制文件.a。
而与静态链接库相对的是动态链接库,同样的是把主函数mian.c和动态库进行链接,与静态库不同的是,这个动态库在程序运行的阶段才会被加载进内存,参与主函数运行
下面用几张图来说明一下:
动态编译和静态编译——制作动态库和静态库_第3张图片
动态编译和静态编译——制作动态库和静态库_第4张图片

还可以加上-static选项,让链接静态库后的math.out彻底的独立起来,“完全静态”,因此,得到的二进制文件会非常大。
在这里插入图片描述
动态编译和静态编译——制作动态库和静态库_第5张图片
动态编译和静态编译——制作动态库和静态库_第6张图片

使用静态/动态链接库的优缺点:

静态库:

编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译
静态库的代码在编译时链接到应用程序中,因此编译时库文件必须存在并且需要通过“-L”参数传递给编译器,应用程序在开始执行时库函数代码将随程序一 起调入进程内存段直到进程结束,其执行过程不需要原静态库存在。

动态库:

动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便
不同的INIX系统链接动态库方法,实现细节不一样,编译PIC型.o中间文件的方法一般是采用C语言编译器的-KPIC或者 -fPIC选项
最主要的是GCC命令行的一个选项:
-shared:该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类
型的导出符号) ,不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

制作链接库的目的(商业角度):

这就和商业项目挂钩了:
假如我们是一个项目的外包方,我们是有专利的,希望别人使用我们已经实现的功能,但又不希望别人看到我们的源代码,所以这对商业机构是非常友好的。

Makefile中的使用实例:

动态编译和静态编译——制作动态库和静态库_第7张图片
动态编译和静态编译——制作动态库和静态库_第8张图片

你可能感兴趣的:(嵌入式linux学习笔记,gcc,编译调试问题)