当我们的程序中有经常使用的模块,而且这种模块在其他程序中也会用到,这时按照软件重用的思想,我们应该将它们生成库,使得以后编程可以减少开发代码量。
通常把一些公用函数制作成函数库,供其他程序使用。函数库分为静态库和动态库两种。通常来说,静态库以.a作为后缀,且以lib开头。类似于libxxx.a。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
1. 生成静态库流程
-
编译成可重定位文件,即生成.o文件
-
使用[[makefile脚本|ar命令]]制作成静态库
- 静态库的使用
静态库的代码在编译时链接到应用程序中,因此编译时库文件必须存在,并且需要通过"-L"参数传递路径给编译器。
链接的库名为libtest.a,在链接的时候,去掉开头的lib和后缀.a,前面再加l,就变成了-ltest,其他库也是类似。
2. AR命令详细用法
当我们的程序中有经常使用的模块,而且这种模块在其他程序中也会用到,这时按照软件重用的思想,我们应该将它们生成库,使得以后编程可以减少开发代码量。这里介绍两个命令ar和nm,用来对库操作。
ar命令可以用来创建、修改库,也可以从库中提出单个模块。
库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。下面是ar命令的格式:
例如我们可以用ar rv libtest.a hello.o hello1.o
来 生成一个库,库名字是test,链接时可以用-ltest链接。该库中存放了两个模块hello.o和hello1.o。选项前可以有‘-'字符,也可以 没有。
下面我们来看看命令的操作选项和任选项。现在我们把{dmpqrtx}
部分称为操作选项,而[abcfilNoPsSuvV]
部分称为任选项。{dmpqrtx}
中的操作选项在命令中只能并且必须使用其中一个。
注意>:当给静态库增建一个成员时(加入一个.o文件到静态库中),“ar”可直接 将需要增加的.o文件简单的追加到静态库的末尾。之后当我们使用这个库进行连接生成可执行文件时,链接程序“ld”却提示错误,这可能是:主程序使用了之 前加入到库中的.o文件中定义的一个函数或者全局变量,但连接程序无法找到这个函数或者变量。
这个问题的原因是:之前我们将编译完成的.o文件直接加入到了库的末尾,却并没有更新库的有效符号表。连接程序进行连接时,在静态库的符号索引表中无法定 位刚才加入的.o文件中定义的函数或者变量。这就需要在完成库成员追加以后让加入的所有.o文件中定义的函数(变量)有效,完成这个工作需要使用另外一个 工具ranlib
来对静态库的符号索引表进行更新。
Reference:
[gcc 静态库制作之ar命令使用_程序猿编码的博客-CSDN博客_gcc-ar](https://blog.csdn.net/chen1415886044/article/details/104395351?spm=1001.2014.3001.5506)
[在编译时为什么要加上 –lm ?_程序猿编码的博客-CSDN博客_gcc 编译时请加入-lm](https://blog.csdn.net/chen1415886044/article/details/104370106)
[ar、ranlib、nm命令详解_晶羽科技 (kffy.cn)](http://www.kffy.cn/meiwen/357012.html)