1.如果要将多个.o文件生成一个库文件,则存在两种类型的库,一种是静态库,在linux里面后缀是.a,另一种是动态库,后缀为.so。

当可执行程序要与静态库进行链接时,所用到的库中的函数和数据会被拷贝到最终的可执行程序中。而采用动态库则不会,程序加载器在后台为我们讲所需的动态库自动加载到内存中且保证整个系统只有一份拷贝。

如果一个系统中存在多个需要同时运行的程序且这些程序之间存在共享库,那么采用动态库的形式将更节省内存。但是对于嵌入式系统,大多数情况下都是整个软件就是一个可执行程序且不支持动态加载的方式,即以静态库为主。

eg:

创建foo.c bar.c文件,

1 #include <stdio.h>
2 void bar()
3 {
4     printf("This is bar()!\n");
5 }

1 #include<stdio.h>
2 void foo()
3 {
4     printf("This is foo()!\n");
5 }

然后把这两个函数放在静态库libmy.a中,在此之前,需要将他们编译成.o目标文件,然后生成静态库。

gcc -c foo.c bar.c

ar crs libmy.a foo.o bar.o

ar的c参数表示创建一个档案文件,而r参数指示将文件增加到所创建的库文件中,s参数就是为了生成库索引以提高库被链接时的效率。

ar --help:

用法:ar [仿真选项] [-]{dmpqrstx}[abcDfilMNoPsSTuvV] [--plugin <名称>] [成员名] [计数] 归档 文件…
ar -M [<mri-脚本]
命令:
d - 从归档文件中删除文件
m[ab] - 在归档文件中移动文件
p - 打印在归档文件中找到的文件
q[f] - 将文件快速追加到归档文件中
r[ab][f][u] - 替换归档文件中已有的文件或加入新文件
s - 作为 ranlib 工作
t - 显示归档文件的内容
x[o] - 从归档文件中分解文件
特定命令修饰符:
[a] - 将文件置于 [成员名] 之后
[b] - 将文件置于 [成员名] 之前 (于 [i] 相同)
[D] - 将 0 用于时间戳和 uid/gid(默认)
[D] - 使用实际时间戳和 uid/gid
[N] - 使用名称的实例 [数量]
[f] - 截去插入的文件名称
[P] - 在匹配时使用完整的路径名
[o] - 保留原来的日期
[u] - 只替换比当前归档内容更新的文件
通用修饰符:
[c] - 不在必须创建库的时候给出警告
[s] - 创建归档索引 (cf. ranlib)
[S] - 不要创建符号表
[T] - 产生一个简单归档
[v] - 输出较多信息
[V] - 显示版本号
@<file> - 从 <file> 读取选项
--target=BFDNAME - 指定目标对象格式为 BFDNAME
可选项:
--plugin <p> - 加载指定的插件程序
仿真选项:
没有仿真特有的选项

库一旦生成,我们可以检测其可用性,main.c如下:

1 extern void foo();
2 extern void bar();
3 int main (void)
4 {
5     foo();
6     bar();
7     return 0;
8 }

执行:gcc main.c libmy.a -o app

./app

可以看到函数输出。

ar t libmy.a   可以看到libmy库的内容,(t参数,详情man)

d参数可以删除库中的目标文件:

ar d libmy.a foo.o

2.或许不如你所期

将上面的生成可执行文件命令做点更改:gcc main.c libmy.a -o app改成gcc libmy.a main.c -o app

居然报错了,找不到依赖项了:

这样可以看出,gcc对于依赖项需要从左往右指定。gcc的这种奇怪特性造成当依赖关系比较复杂时需要对同一个库在不同的位置指定多次,否则就会出现无法成功链接的情形。

3.需要知道的小东西

-L选项用于告诉gcc从哪个目录查找库文件,可以多次使用它指定多个目录;

-l(小L)选项用于告诉gcc在生成可执行程序是需要链接的库名,这一选项同样可以多次使用以指定多个库。

使用-l选项时要注意,后面所跟名字并不包括lib前缀和.a后缀,比如上面例子中的-lmy代表指定libmy.a参与链接。(-l选项个人感觉有点鸡肋,必须命名成lib前缀,.a后缀)

测试发现,-L和-l选项有着依赖关系,可以只是用-L选项,后面使用库的全名,但是不能只使用-l选项,否则将出现erro。

转载于:https://www.cnblogs.com/yangguang-it/p/6442119.html

binutils工具集之---ar相关推荐

  1. binutils工具集

    如果使用 gcc 作为编译器,那么 binutils 就是必不可少的一个工具集.工具集中的部分工具除了被 gcc 在后台使用为我们创建程序文件(目标文件.库文件或可执行程序)外,其它的则有助于方便开发 ...

  2. binutils工具集用法

    addr2line用于得到程序指令地址所对应的函数,以及函数所在的源文件名和行号. 在不少嵌入式开发环境中,编译器的名称往往不是gcc,而是想arm-rtems-gcc这样的,对于这种命名形式的编译器 ...

  3. Binutils工具集 GCC工具集介绍

    GNU Binutils详解:http://www.crifan.com/files/doc/docbook/binutils_intro/release/html/binutils_intro.ht ...

  4. Linux二进制实用工具Binutils工具集解析()

    From:http://blog.csdn.net/zqixiao_09/article/details/50783007 GNU Binutils:http://www.gnu.org/softwa ...

  5. 嵌入式软件开发杂谈(4):Binutils工具集

    文章目录 1 addr2line 2 nm 3 readelf 3.1 -h 3.2 -l 3.3 -S 3.4 -t 3.5 -s 3.6 -n 3.7 -d 4 size 5 objdump 6 ...

  6. Binutils工具集 解析

    对于嵌入式系统开发,掌握相应的工具至关重要,它能使我们解决问题的效率大大提高.目前,可以说嵌入式系统的开发工具是GNU的天下,因为来自GNU的GCC编译器支持大量的目标处理器.除了GCC,还有一个非常 ...

  7. GNU binutils工具集

    前言 GNU binutils工具提供了一系列二进制工具,用于日常开发过程中对程序调试和维护,经常会用到的工具如下: as:汇编编译器,用于将汇编代码编译成目标文件; addr2line:用于得到程序 ...

  8. GNU工具链简介(GCC编译器+Binutils工具集+GDB调试器+make工具)

    以下内容源于网络资源的学习与整理,如有侵权请告知删除. 一.什么是工具链 在软件工程中,工具链(toolchain)是一系列用于制作软件的工具.它包括用来编辑源代码的文本编辑器.生成可执行文件的编译器 ...

  9. binutils工具集之---nm

    nm用于列出程序文件中的符号.建立nmtest.c文件: 1 #include<time.h>2 3 int global1;4 int global2=3;5 6 static int ...

最新文章

  1. RollingFileAppender
  2. LeetCode171——Excel Sheet Column Number
  3. webservice入门程序学习中经验总结
  4. js关闭当前页面窗口的问题
  5. 【学习OpenCV4】在OpenCV中响应键盘与鼠标操作
  6. 管理感悟:忙的真正含义是没心思
  7. Sybase数据库安全
  8. 【机器学习】【Apriori算法-1】Apriori算法原理详解 + 示例展示数学求解过程
  9. CSS3之图片列表展示特效
  10. Excel — 动态图表(复选框实现动态图)
  11. 打开手机这个功能,你的微信、支付宝再也不怕被盗刷,网友:放心了
  12. 如何选择最好的研究方法?——Nvivo教程
  13. 好用的企微scrm系统应具备哪些能力
  14. python的gmtime函数_学不会的Python函数——日期时间函数
  15. 【Image2Lcd X TFT_LCD】—— 图片取模软件使用
  16. labelmx条码打印软件3.7
  17. 全部汽车零部件更换周期 汽车零部件固定更换周期
  18. 11.14 Daily Scrum
  19. 实时用户在线人数统计(一):表统计
  20. 设计模式 — 6大设计原则(依赖倒置和接口隔离原则)

热门文章

  1. 360安全卫士电脑版_教你降服“流氓头子”正确打开360安全卫士的姿势,还你电脑流畅体验...
  2. pytorch load state dict_PyTorch 学习笔记(五):Finetune和各层定制学习率
  3. iphone新旧手机数据传输已取消_如何取消iPhone手机App自动扣费?三种方法让你不再被“偷”...
  4. 2018深大计算机考研,深圳大学2018年硕士生招生复试分数线及调剂需求
  5. 图片识别出处_AI人脸识别
  6. C语言与Java的对比,你想好选谁了吗?
  7. Linux C语言编程基本原理与实践
  8. centos6.5 安装多个mysql_在centos6,5(64位)系统安装多实例mysql5.6
  9. oracle 查询不同编号的时间最小记录_投稿 | ORACLE amp; PostgreSql 利用伪列删除完全重复的两行...
  10. 性能php 教程,提高PHP性能效率的几个技巧