ar - 创建静态库.a文件_swartz_lubel的博客-程序员宅基地

技术标签: ar  centos  

用途说明

创建静态库.a文件。用C/C++开发程序时经常用到,但我很少单独在命令行中使用ar命令,一般写在makefile中,有时也会在shell脚 本中用到。关于Linux下的库文件、静态库、动态库以及怎样创建和使用等相关知识,参见本文后面的相关资料【3】《关于Linux静态库和动态库的分析》。

 

常用参数

格式:ar rcs  libxxx.a xx1.o xx2.o

参数r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。【1】

参数c:创建一个库。不管库是否存在,都将创建。

参数s:创建目标文件索引,这在创建较大的库时能加快时间。(补充:如果不需要创建索引,可改成大写S参数;如果.a文件缺少索引,可以使用ranlib命令添加)

 

格式:ar t libxxx.a

显示库文件中有哪些目标文件,只显示名称。

 

格式:ar tv libxxx.a

显示库文件中有哪些目标文件,显示文件名、时间、大小等详细信息。

 

格式:nm -s libxxx.a

显示库文件中的索引表。

 

格式:ranlib libxxx.a

为库文件创建索引表。

 

使用示例

示例一 在shell脚本中使用

 

Bash代码   收藏代码
  1. OS=`uname -r`  
  2. ar rcs libhycu.a.$OS *.o  
 

 

示例二 在makefile中使用

Makefile代码   收藏代码
  1. $(BIN1): $(BIN1_OBJS)  
  2.         ar rcs [email protected] $^  

 

 

示例三 创建并使用静态库

第一步:编辑源文件,test.h test.c main.c。其中main.c文件中包含main函数,作为程序入口;test.c中包含main函数中需要用到的函数。

vi test.h test.c main.c

第二步:将test.c编译成目标文件。

gcc -c test.c

如果test.c无误,就会得到test.o这个目标文件。

第三步:由.o文件创建静态库。

ar rcs libtest.a test.o

第四步:在程序中使用静态库。

gcc -o main main.c -L. -ltest

因为是静态编译,生成的执行文件可以独立于.a文件运行。

第五步:执行。

./main

 

示例四 创建并使用动态库

第一步:编辑源文件,test.h test.c main.c。其中main.c文件中包含main函数,作为程序入口;test.c中包含main函数中需要用到的函数。

vi test.h test.c main.c

第二步:将test.c编译成目标文件。

gcc -c test.c

前面两步与创建静态库一致。

第三步:由.o文件创建动态库文件。

gcc -shared -fPIC -o libtest.so test.o

第四步:在程序中使用动态库。

gcc -o main main.c -L. -ltest

当静态库和动态库同名时, gcc命令将优先使用动态库。

第五步:执行。

LD_LIBRARY_PATH=. ./main

 

示例五 查看静态库中的文件

[[email protected] lib]# ar -t libhycu.a
base64.c.o
binbuf.c.o
cache.c.o
chunk.c.o
codec_a.c.o
...
xort.c.o
[[email protected] lib]#
[[email protected] lib]# ar -tv libhycu.a
rw-r--r-- 0/0   7220 Jul 29 19:18 2011 base64.c.o
rw-r--r-- 0/0   2752 Jul 29 19:18 2011 binbuf.c.o
rw-r--r-- 0/0  19768 Jul 29 19:18 2011 cache.c.o
...
rw-r--r-- 0/0   4580 Jul 29 19:18 2011 xort.c.o
[[email protected] lib]#

[[email protected] lib]# nm -s libhycu.a | less

Archive index:
Base64Enc in base64.c.o
GetBase64Value in base64.c.o
Base64Dec in base64.c.o
encode64 in base64.c.o
decode64 in base64.c.o
check64 in base64.c.o
test64 in base64.c.o
...
chunk_alloc in chunk.c.o
[[email protected] lib]#

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/swartz_lubel/article/details/77131659

智能推荐

ubuntu 搭建django 环境_weixin_30644369的博客-程序员宅基地

ubuntu 默认安装了 python2.7 。安装djangoapt install python-django;安装mysqlapt install mysql-server* *代表版本号vim /etc/mysql/mysql.conf.d/mysqld.cnf 添加 character-set-server = utf8 设置服务端编码utf8 ...

Centos安装zip_王紫又的博客-程序员宅基地_centos zip

简单粗暴sudo yum install -y unzip zipsudo yum list |grep gccsudo yum install gcc-c++sudo yum install unzip

scss值列表_Sass中的数据类型_weixin_40003512的博客-程序员宅基地

数据类型几乎在所有编程语言当中都有,在Sass中也不例外。数据类型是根据不同的用途分的类。例如2是一个数值(number),而SitePoint是一个字符串(string)。在这篇文章中,将涵盖Sass中所有的数据类型(共有七种数据类型),并且通过一些简单的例子来阐述这些数据类型在Sass中如何使用。Nullnull是Sass中最基本的数据类型,它既不是true也不是false,而表示的是空。它没...

win10安装opcenum_U盘安装WIN10时显示 windows无法安装到这个磁盘 选中的磁盘采用GPT分区形式..._CRomputer-罗军的博客-程序员宅基地

一、原因分析win8/win10系统均添加快速启动功能,预装的win8/win10电脑默认都是UEFI引导和GPT硬盘,传统的引导方式为Legacy引导和MBR硬盘,UEFI必须跟GPT对应,同理Legacy必须跟MBR对应。如果BIOS开启UEFI,而硬盘分区表格式为MBR则无法安装;BIOS关闭UEFI而硬盘分区表格式为GPT也是无法安装Windows。(注意事项:转换分区表格式会清空硬盘所有...

Unity 在Game窗口下显示mesh_皮皮#2500的博客-程序员宅基地_unity 显示mesh

Unity 在Game窗口下显示mesh问题描述实现方法问题描述在Scene窗口中,当我们点击一个物体时,会显示出一个物体的纹理:但是在Game窗口中,我们时看不到这个纹理的:目标:希望在Game窗口中可以看到和Scene窗口中一样的纹理效果。实现方法安装插件Wireframe将解压后的工程放到Unity工程Asset文件夹下:在Unity中,新建一个材质球,然后将Wireframe文件夹下的UCLA GameLab Wireframe.sh着色器附加到新建的材质球上:将材质球附加

mui:第一次在AppStore 上线应用_前行中632的博客-程序员宅基地

时间:在第一天上午发布,第二天早上便通过了,所以整体还是很快的 过程:整体是一个开发了差不多有两个月的项目—易沃克,从最初的一无所知的忐忑,到最后的淡然,感觉受益良多,(闲话少说) 这是H5的项目,是基于mui框架的基本模型,总体上是有js和html语言写成,并已经实现了具体的功能,可以投入使用,但作为一个H5文件,不可避免的就是他的性能瓶颈,他的刷新可以说是令人很不满意的,我使用的是appup

随便推点

RecyclerView的通用适配器_hjl343661629的博客-程序员宅基地

RecyclerView的通用适配器 本来这一个主题应该早就写了,只是项目多,属于自己的时间不多,所以现在才开动!!前一段时间写了一篇文章,是关于ListView,GriView万能适配器,没有看过的同学,可以先看看那篇文章,然后在来学习RecyclerView的话,会容易很多。链接http://www.cnblogs.com/huangjial...

【洛谷】P1372 又是毕业季I 题解_跑起来要带风!的博客-程序员宅基地

【洛谷】P1372 又是毕业季I 题解原题地址:https://www.luogu.org/problem/P1372题目背景“叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻。毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌。1000多个日夜的欢笑和泪水,全凝聚在毕业晚会上,相信,这一定是一生最难忘的时刻!题目描述为了把毕业晚会办得更好,老师想要挑出默契程...

There are 0 datanode(s) running,解决Hadoop启动时,没有启动datanode_闷声$的博客-程序员宅基地

向Hadoop上传文件时出现错误:There are 0 datanode(s) running and no node(s) are excluded in this operation.,用jps命令查看发现datanode没有启动。解决:

transE论文阅读 19年记录的_peaceminusvip的博客-程序员宅基地_transe论文

论文标题:Translating Embeddings for Modeling Multi-relational Data——NIPS2013论文链接https://proceedings.neurips.cc/paper/2013/file/1cecc7a77928ca8133fa24680a88d2f9-Paper.pdfhttps://proceedings.neurips.cc/paper/2013/file/1cecc7a77928ca8133fa24680a88d2f9-Pa.

java jar class_JAVA jar命令(一)-jar打包class文件_数据汪的博客-程序员宅基地

jar包本质上是将所有class文件、资源文件压缩打成一个包(也可以选择不压缩),可选择在jar包中生成META-INF/MANIFEST.MF文件,MANIFEST.MF是清单文件,里面可以记录主类、classpath等信息,供虚拟机使用。接下来的一段时间里,我们将以以下路径学习jar命令和清单文件的相关知识jar打包class文件带包class文件jar打包清单文件的使用在这篇文章里我们将使用...

Hibernate注释大全_zhugeyangyang1994的博客-程序员宅基地

每个持久化POJO类都是一个实体Bean, 通过在类的定义中使用@Entity 注解来进行声明。声明实体[email protected] class Flight implements Serializable {  Long id;  @Id  public Long getId() { return id; }  public void setId(Long