静态库

当我们的程序中有经常使用的模块,而且这种模块在其他程序中也会用到,这时按照软件重用的思想,我们应该将它们生成,使得以后编程可以减少开发代码量。
通常把一些公用函数制作成函数库,供其他程序使用。函数库分为静态库和动态库两种。通常来说,静态库以.a作为后缀,且以lib开头。类似于libxxx.a。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

1. 生成静态库流程

  1. 编译成可重定位文件,即生成.o文件

  2. 使用[[makefile脚本|ar命令]]制作成静态库

  3. 静态库的使用

    静态库的代码在编译时链接到应用程序中,因此编译时库文件必须存在,并且需要通过"-L"参数传递路径给编译器。
    链接的库名为libtest.a,在链接的时候,去掉开头的lib和后缀.a,前面再加l,就变成了-ltest,其他库也是类似。

2. AR命令详细用法

当我们的程序中有经常使用的模块,而且这种模块在其他程序中也会用到,这时按照软件重用的思想,我们应该将它们生成库,使得以后编程可以减少开发代码量。这里介绍两个命令ar和nm,用来对库操作。

ar命令可以用来创建、修改库,也可以从库中提出单个模块。

库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。下面是ar命令的格式:  

ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files… 
 

例如我们可以用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)

来自广东
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇