binutils工具集之---ar
1.如果要将多个.o文件生成一个库文件,则存在两种类型的库,一种是静态库,在linux里面后缀是.a,另一种是动态库,后缀为.so。
当可执行程序要与静态库进行链接时,所用到的库中的函数和数据会被拷贝到最终的可执行程序中。而采用动态库则不会,程序加载器在后台为我们讲所需的动态库自动加载到内存中且保证整个系统只有一份拷贝。
如果一个系统中存在多个需要同时运行的程序且这些程序之间存在共享库,那么采用动态库的形式将更节省内存。但是对于嵌入式系统,大多数情况下都是整个软件就是一个可执行程序且不支持动态加载的方式,即以静态库为主。
eg:
创建foo.c bar.c文件,
#include <stdio.h>
void bar()
{
printf("This is bar()!\n");
}
#include<stdio.h>
void foo()
{
printf("This is foo()!\n");
}
然后把这两个函数放在静态库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如下:
extern void foo();
extern void bar();
int main (void)
{
foo();
bar();
return ;
}
执行: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。

binutils工具集之---ar的更多相关文章
- binutils工具集之---addr2line
addr2line用于得到程序指令地址所对应的函数,以及函数所在的源文件名和行号. 在不少嵌入式开发环境中,编译器的名称往往不是gcc,而是想arm-rtems-gcc这样的,对于这种命名形式的编译器 ...
- Binutils工具集常用工具
GNU为GCC编译器提供了配套的辅助工具集(Binutils)http://www.gnu.org/software/binutils/ 1. addr2line ①将指定地址转换为对应的文件名和行号 ...
- 静态库动态库的编译、链接, binutils工具集, 代码段\数据段\bss段解释
#1. 如何使用静态库 制作静态库 (1)gcc *.c -c -I../include得到o文件 (2) ar rcs libMyTest.a *.o 将所有.o文件打包为静态库,r将文件插入静态库 ...
- Makefile 学习&binutils工具集,软件开发利器
gcc -E 能有效的帮助我们解决与宏有关的编译错误: gcc -S能获得一个C源程序文件的汇编程序: gcc -v能获得系统头文件的路径 生成依赖关系: gcc -M gcc -MM 生成不包含系统 ...
- binutils工具集之---nm
nm用于列出程序文件中的符号.建立nmtest.c文件: #include<time.h> int global1; ; static int static_global1; ; void ...
- binutils工具集之---objcopy,ranlib,size,strings,strip
objcopy的作用是拷贝一个目标文件的内容到另一个目标文件中.objcopy使用GNU BFD库去读或写目标文件.objcopy可以使用不同于源目标文件的格式来写目的目标文件(也即是说可以将一种格式 ...
- binutils工具集之---objdump
在嵌入式软件开发中,有时需要知道所生成的程序文件中的段信息以分析问题,或者需要查看c语言对应的汇编代码,此时,objdump工具就可以帮大忙了.obj——object dump:转储. #inclu ...
- GNU Binutils工具
参考<程序员的自我修养---连接.装载与库> 以下内容转贴自 http://www.cnblogs.com/xuxm2007/archive/2013/02/21/2920890.html ...
- Open Source 开发工具集
Open Source 开发工具集 转自:http://www.linuxforum.net原作者:gogoliu(Pooh-Bah) 编辑器: vi:老牌编辑器,在各个unix和unix-like平 ...
随机推荐
- 在浏览器中使用JS打开并展示PDF文件
使用jquery.media.js插件 示例: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=& ...
- JS获取浏览器高宽度,屏幕分辨率和一些定位空隙等
IE中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.d ...
- 微信小程序调用后台接口+热点新闻滚动展示
1.微信JS文件,发送请求调用: //将返回接口数据,写入Page({data})里面 //获取热点新闻,这个也是写在onload:function(){//code)里面的 wx.request( ...
- HDUOJ--8球胜负
8球胜负 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 【LeetCode】130. Surrounded Regions (2 solutions)
Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A ...
- mac下安装mysql 1820 重置默认密码
mac安装mysql时会给出一个临时密码 记录下来 2018-03-17T02:14:10.809431Z 1 [Note] A temporary password is generated for ...
- jquery插件--ajaxfileupload.js上传文件原理分析
英文注解应该是原作者写的吧~说实话,有些if判断里的东西我也没太弄明白,但是大致思路还是OK的. jQuery.extend({ createUploadIframe: function (id, u ...
- 关闭VS的实时调试器
今天要安装一个水晶报表.安装过程有几个文件有错误.结果这个vs的实时调试器老是调出来.而且还是5次跳出来等你取消5次之后,才到默认的忽略的界面.你知道有多烦的,还得看这他,点完一次还要等几秒钟.差点崩 ...
- 安装配置PhoneGap开发环境(一)
1 安装JDK 略. 2 安装Eclipse并安装ADT插件 Android的官网提供集成了Android插件的Eclipse开发环境. 眼下訪问不了,尝试百度一下其他资源. 3 安装Android ...
- Mac 开发者设置强迫症
Latest commit 2461787 on Mar 1 原文链接 强迫症的 Mac 设置指南 如何配置一个高效的 Mac 工作环境 English Version Table of Conten ...