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

本文详细介绍了GCC如何生成动态链接库(.so文件)和静态链接库(.a文件),包括编译选项-shared和-fPIC的使用。动态库在运行时加载,程序较小,而静态库在编译时合并,程序独立但较大。讨论了两者优缺点,如静态库适合不需要频繁更新的环境,动态库利于代码共享。此外,商业角度上,静态库能保护源代码,适合外包项目。文中还给出了Makefile的使用示例。
摘要由CSDN通过智能技术生成

参考链接

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中的使用实例:

在这里插入图片描述
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值