13-2 静态链接库的构建和使用

本文介绍了静态链接库与动态链接库的概念及其在程序编译和运行时的区别。静态链接库在编译时即确定函数地址,与主程序合并成可执行文件;动态链接库则在运行时才解析函数地址,实现共享。通过举例说明如何编译静态链接库,包括创建目标文件、使用ar命令打包生成.a文件,并展示了在缺少静态链接库时的错误及解决方案。
摘要由CSDN通过智能技术生成

1. 静态链接库与动态链接库

        程序编译时发生的动作称为静态行为,程序运行时发生的动作称为动态行为。故链接共分为两种,静态链接和动态链接。目前来看,链接使用的原因在于,主程序文件执行时需要引入头文件,执行外部函数。而引入头文件时,在编译阶段确定外部函数的地址还是在运行阶段确定外部函数的地址,由此产生了静态链接和动态链接两种方案。

        静态链接是在编译阶段确定外部符号地址,并将依赖的符号其对应的目标文件与主程序文件一同编译,形成最后的可执行程序。

        动态链接是在程序运行期间,根据程序需要,在动态链接库加载时才确定外部符号的地址动态链接库不需要打包到可执行程序中,只需要存在于特定的路径中

        动态链接库是共享的,任意程序都可加载。动态链接库在 Linux 系统下后缀为 .so,在 Windows 系统下后缀为 .dll,在 Mac 系统上为 .dylib。而静态链接库只存在于某个特定的程序文件中,不能共享。静态链接库在 Windows 系统下后缀为 .a。

2. 编译静态链接库

        例如,对主程序文件为 02.static_library.c 文件进行静态链接库的编译。主程序 02.static_library.c 文件引入 factorial.h 和 fibonacci.h 头文件,从而执行 Factorial() 和 Fibonacci() 函数。其编译静态链接库的具体过程如下:

                1)准备工作,创建 mathutils 文件夹及相应的 .h 头文件和 .c 文件

                 2)将主程序文件 02.static_library.c 中引用的外部函数的所在 .c 文件编译为目标文件

                 3)使用 ar(类似于打包的 zip 命令)将目标文件进行打包,生成 .a 文件,即生成静态链接库。ar 命令使用时添加了三个参数 r c s,可使用 ar -h 查看各参数功能。r 表示将新文件进行打包,c 表示新建包时不发出警告,s 表示创建包的索引。(r:replace existing or insert new file(s) into the archive. c:do not warn if the library had to be created s:create an archive index)

                 此外,可使用 ar t 进行打包文件的查看(t:display contents of the archive)

                4)此时,未添加静态链接库,而直接编译主程序文件 02.static_library,其运行结果如下图所示。错误原因为主程序文件找不到头文件中引用的 Factorial() 和 Fibonacci() 函数。

                 解决方法为添加静态链接库进行编译,其结果如下。实质上,不一定非要 .a 文件,直接添加待引用函数的 .o 文件也可达到同样效果。但缺点在于,若添加的 .o 文件过多,.a 文件较 .o 文件更为方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值