≡菜单

UNIX ar示例:如何创建,查看,提取,修改C存档文件(* .a)

ar is an archive tool used to combine objects to create an archive 文件 with .a extension, also known as library.

在本文中,让我们讨论如何使用C语言在C编程中创建用户定义的静态库。“ar”效用。这些示例说明如何使用Linux ar命令创建,提取和修改档案。

为了演示静态库的创建,让我们创建两个C程序—加法c和乘法c

使用gcc,可以获得这些程序的目标代码,并从这两个对象创建静态库libarith.a。

1.创建两个示例C程序

创建如下所示的additional.c程序。

int addition(int a,int b)
{
int result;
result = a + b;
return result;
}

创建multiplication.c程序,如下所示。

int multiplication(int a, int b)
{
int result;
result = a * b;
return result;
}

前一阵子我们讨论了使用C语言编写C程序的基础 C Hello世界示例.

2.编译程序并获取目标代码

Use -c option to compile both the c program. Using option -c will create the corresponding .o 文件s.

$ gcc -c addition.c

$ gcc -c multiplication.c

Now, the current working directory contains both the .c and .o 文件s as shown below.

$ ls
addition.c   multiplication.c   addition.o   multiplication.o

3.使用ar实用程序创建C程序静态库

Now create the static library “libarith.a” with the addition object 文件 and multiplication object 文件 as follows,

$ ar cr libarith.a addition.o multiplication.o

4.编写C程序以使用库libarith.a

The library 文件 libarith.a is now ready to usage. Following example indicates how to write a sample C program with the header 文件 to use the libarith.a static library.

创建header.h:

#include <stdio.h>
int addition(int a,int b);
int multiplication(int a,int b);

创建example.c:

#include "header.h"
int main()
{
int result;
result = addition(1,2);
printf("addition result is : %d\n",result);
result = multiplication(3,2);
printf("multiplication result is :  %d\n",result);
}

注意: 如何通过5个简单步骤使用gdb调试C程序 提供有关调试C代码的分步说明。

编译example.c:

$ gcc -Wall example.c -L/home/guest/ -larith -o example

选项-L指示编译器在/ home / guest目录中查找库文件。编译器从该目录中获取libarith库文件,并使用example.c程序对其进行编译。

编译example.c的另一种方法:

$ gcc -Wall example.c libarith.a -o example

执行示例可执行文件:

$ ./example
addition result is : 3
multiplication result is : 6

5.使用ar命令查看存档中的目标文件,选项t

To list the object 文件s available in the libarith.a:

$ ar t libarith.a
addition.o
multiplication.o

ar命令中的选项与 tar命令.

6.使用ar命令(选项x)从存档中提取目标文件

You can extract the object 文件s available in an archive as follows.

$ mkdir object

$ cp libarith.a object/

$ cd object

$ ar x libarith.a

$ ls *.o
addition.o
multiplication.o

7.使用ar选项r将对象文件添加到现有归档中

Let assume that you have create another object 文件 called subtraction.o

The following command extends the libarith.a library 文件, 通过 inserting subtraction.o object as shown below.

$ ar r libarith.a subtraction.o 

$ ar t libarith.a
addition.o
multiplication.o
subtraction.o

插入.o文件时,该文件已存在于存档中,将被替换。如果不检查替换项,则可以使用-q选项将对象添加到归档的末尾。

8.使用ar删除特定的存档成员,选项d

In order to delete a specific archive member from the library 文件, do the following.

$ ar d libarith.a addition.o

$ ar t libarith.a
multiplication.o
subtraction.o

如果您喜欢这篇文章,您可能还会喜欢..

  1. 50个Linux Sysadmin教程
  2. 50个最常用的Linux命令(包括示例)
  3. 排名前25位的最佳Linux性能监视和调试工具
  4. 妈妈,我找到了! – 15个实用的Linux Find命令示例
  5. Linux 101 Hacks第二版电子书 Linux 101黑客手册

Bash 101 Hacks书 Sed和Awk 101黑客手册 Nagios Core 3书 Vim 101黑客手册

{ 12 评论… 加一 }

  • 拨动 2010年8月11日,下午1:40

    你好,
    我喜欢您的网站,并与我的rss阅读器关注了一段时间。 --

    但是我有一个问题:你为什么写“./file”在某些命令中“file” would be sufficient ? Is that intended to avoid taking ambiguous symlinks as 文件s ?
    (例如:“$ gcc -Wall ./example.c ./libarith.a -o ./example”,据我所知,。/是没用的)

    我想这可能会导致人们逐字逐句地采取行动“bad practices”因为他们可能认为有必要“./”危险的是不写它…

    无论如何,谢谢您的工作。 --
    问候,
    lip

  • 丹尼尔·赖曼 2010年8月12日,上午4:52

    绝对棒谢谢。

  • 所罗门·霍米兹(Solomon Homicz) 2010年8月17日,下午9:53

    这在C ++上会基本相同吗?
    只需将gcc替换为g ++,将.c替换为.cpp?
    您也可以使用fortran吗? gfortran与.f90和.F95?
    如果这是将c或C ++与fortran子例程一起使用的另一种方式,那将很有趣。

  • 拉梅什·纳塔拉詹(Ramesh Natarajan) 2010年8月17日,下午11:52

    @Plip,

    谢谢你的建议。我完全同意你的观点。“./”不需要。这只是一个错误,我’ve从文章中删除了它。

  • 所罗门·霍米兹(Solomon Homicz) 2010年8月19日,下午11:48

    是的,可以使用fortran子例程。我使用了一个C ++主文件,在标头中声明了一个与fortran标头中的公共块匹配的外部C结构,并声明了一个外部C函数(无效)。将fortran编译为目标文件,使用ar生成.a,然后使用g ++进行编译,效果很好!我可以为我的fortran子例程编写一个C ++(或C)包装器,将其包装在一个库中,并有一个对象可以插入并在C ++中使用。太酷了!

  • 火星 2010年12月14日,晚上11:32

    内容丰富的文章
    谢谢

  • 鲍里斯 2012年5月10日,晚上11:00

    你好
    它没有’t work
    我得到/ usr / bin / ld:找不到-larith.a

    哪种维修方式

  • 乔纳斯·库拉(Jonas Kulla) 2012年8月17日,下午3:44

    非常感谢你!
    即使我已经用C编程了一段时间了,
    我真的很喜欢这样的详细/非常简单的分步操作,
    比浏览手册要好得多。

  • 巴厘岛甘甘迪普酒店 2013年2月27日,上午6:01

    很棒的东西,帮助我加载,学习了创建库文件的基础知识,并为其添加了自己的功能。真的充满知识。您的美好努力,将永远感谢我在您的博客中学到的东西-

  • 匿名 2014年8月9日,上午6:37

    我认为您忘记了-s选项来为存档建立索引,因为我可以’t与库链接(静态),因为它说存档没有索引(因此是必需的)。所以代替“ar -cr” use “ar -crs”

  • 斯拉瓦尼 一月6,2016,6:31上午

    你好
    详细信息非常有用。
    I was able to get .o 文件s from an archive 文件 extension .a
    Can anybody please let me know is there any tool or set of commands to do the reverse engineering (conversion from .a to c 文件s or to any readable format).
    谢谢。

  • Vismitha 2016年2月18日,上午10:02

    清除笔记

发表评论