如何使用Linux的ar命令创建静态库

在Linux笔记本电脑上提示ShellFatmawati Achmad Zaenuri / Shutterstock.com

使用Linux AR 在开发软件时创建函数库的命令。本教程将向您展示怎样创建静态库,修改它,并在程序中使用它,并附带示例代码。

AR 命令是一个真正的退伍军人 – 它自1971年以来一直存在。名称 AR 引用该工具的原始用途,即创建存档文件。归档文件是单个文件,充当其他文件的容器。有时对于许多其他文件。可以在归档中添加,删除或提取文件。寻找这种功能的人不再愿意 AR。该角色已被其他公用事业公司接管 柏油

AR 但是,命令仍然用于一些专业目的。 AR 用于创建静态库。这些用于软件开发。和 AR 也可用于创建包文件,例如Debian Linux发行版中使用的“.deb”文件及其衍生产品(如Ubuntu)。

我们将完成创建和修改静态库所需的步骤,并演示怎样在程序中使用该库。为此,我们需要实现静态库。该库的目的是编码文本字符串并解码编码文本。

请注意,这是一个快速而肮脏的黑客,用于演示目的。不要将此加密用于任何有价值的东西。它是世界上最简单的替换密码,其中A变为B,B变为C,依此类推。

有关: 怎样使用Linux上的tar命令压缩和提取文件

cipher_encode()和cipher_decode()函数

我们将在一个名为“library”的目录中工作,稍后我们将创建一个名为“test”的子目录。

我们在这个目录中有两个文件。在一个名为cipher_encode.c的文本文件中,我们有 cipher_encode() 功能:

void cipher_encode(char * text)

 for(int i = 0; text(i)!= 0x0; i ++)
   文本(ⅰ)++;
 

// cipher_encode的结尾

相应的 cipher_decode() function在一个名为cipher_decode.c的文本文件中:

void cipher_decode(char * text)

 for(int i = 0; text(i)!= 0x0; i ++)
   文本(I) – ;
 

// cipher_decode的结尾

包含编程指令的文件称为源代码文件。我们将创建一个名为libcipher.a的库文件。它将包含这两个源代码文件的编译版本。我们还将创建一个名为libcipher.h的短文本文件。这是一个头文件,包含新库中两个函数的定义。

拥有库和头文件的任何人都可以在自己的程序中使用这两个函数。他们不需要重新发明轮子并重新编写功能;他们只是使用我们图书馆的副本。

编译cipher_encode.c和cipher_decode.c文件

要编译源代码文件,我们将使用 GCC,标准的GNU编译器。该 -C (编译,没有链接)选项告诉 GCC 编译文件然后停止。它从每个源代码文件生成一个称为目标文件的中间文件。该 GCC 链接器通常获取所有目标文件并将它们链接在一起以生成可执行程序。我们正在通过使用。跳过这一步 -C 选项。我们只需要目标文件。

让我们检查一下我们认为我们做的文件。

ls -l

在终端窗口

这两个源代码文件存在于此目录中。我们来使用吧 GCC 将它们编译为目标文件。

gcc -c cipher_encode.c
gcc -c cipher_decode.c

应该没有输出 GCC 如果一切顺利。

在终端窗口中输出gcc

这将生成两个与源代码文件同名但具有“.o”扩展名的目标文件。这些是我们需要添加到库文件的文件。

ls -l

在终端窗口中输出ls -l

创建libcipher.a库

要创建库文件 – 实际上是一个存档文件 – 我们将使用 AR

我们正在使用 -C (创建)选项来创建库文件 -r (添加替换)选项将文件添加到库文件,然后 -s (index)选项,用于创建库文件中文件的索引。

我们将调用库文件libcipher.a。我们在命令行上提供该名称,以及我们要添加到库中的目标文件的名称。

ar -crs libcipher.a cipher_encode.o cipher_decode.o

ar -crs libcipher.a cipher_encode.o cipher_decode.o在终端窗口中

如果我们列出目录中的文件,我们将看到我们现在有一个libcipher.a文件。

ls -l

终端窗口中的ls输出

如果我们使用 -t (表)选项 AR 我们可以看到库文件中的模块。

ar -t libcipher.a

ar -t libcipher.a在终端窗口中

创建libcipher.h头文件

libcipher.h文件将包含在使用libcipher.a库的任何程序中。 libcipher.h文件必须包含库中函数的定义。

要创建头文件,我们必须在文本编辑器(如gedit)中键入函数定义。将文件命名为“libcipher.h”并将其保存在与libcipher.a文件相同的目录中。

void cipher_encode(char * text);
void cipher_decode(char * text);

使用libcipher库

测试我们新库的唯一可靠方法是编写一个程序来使用它。首先,我们将创建一个名为test的目录。

mkdir测试

我们将库和头文件复制到新目录中。

cp libcipher。* ./ test

我们将更改为新目录。

cd测试

我们来检查一下我们的两个文件。

ls -l

终端窗口中的cp libcipher。* ./test

我们需要创建一个可以使用库并证明它按预期运行的小程序。在编辑器中键入以下文本行。将编辑器的内容保存到测试目录中名为“test.c”的文件中。

#包括
#包括

#include“libcipher.h”

int main(int argc,char * argv())

 char text()=“How-To Geek喜欢Linux”;

 放(文本);

 cipher_encode(文本);
 放(文本);

 cipher_decode(文本);
 放(文本);

 退出(0);

//主要结束

程序流程非常简单:

  • 它包含libcipher.h文件,以便它可以查看库函数定义。
  • 它创建了一个名为“text”的字符串,并在其中存储了“How-To Geek喜欢Linux”的字样。
  • 它将该字符串打印到屏幕上。
  • 它称之为 cipher_encode() 函数对字符串进行编码,并将编码的字符串打印到屏幕上。
  • 它叫 cipher_decode() 解码字符串并将解码后的字符串打印到屏幕上。

生成 测试 程序,我们需要编译test.c程序并在库中链接。该 -o (输出)选项告诉 GCC 什么叫它生成的可执行程序。

gcc test.c libcipher.a -o test

gcc test.c libcipher.a -o在终端窗口中进行测试

如果 GCC 默默地返回命令提示符,一切都很好。现在让我们测试我们的程序。关键时刻:

。/测试

./test在终端窗口中

我们看到了预期的产出。该 测试 程序打印纯文本打印加密文本,然后打印解密文本。它正在使用我们新库中的功能。我们的图书馆正在运作

终端窗口中的测试程序输出

成功。但为何停在那里?

将另一个模块添加到库中

让我们为库添加另一个函数。我们将添加一个程序员可以用来显示他们正在使用的库版本的函数。我们需要创建新函数,编译它,并将新对象文件添加到现有库文件中。

在编辑器中键入以下行。将编辑器的内容保存到库目录中名为cipher_version.c的文件中。

#包括

void cipher_version(void)

 puts(“How-To Geek ::非常不安全的密码库”);
 puts(“Version 0.0.1 Alpha n”);

// cipher_version的结尾

我们需要将新函数的定义添加到libcipher.h头文件中。在该文件的底部添加一个新行,使其如下所示:

void cipher_encode(char * text);
void cipher_decode(char * text);
void cipher_version(void);

保存修改后的libcipher.h文件。

我们需要编译cipher_version.c文件,以便我们有一个cipher_version.o目标文件。

gcc -c cipher_version.c

终端窗口中的gcc -c cipher_version.c

这会创建一个cipher_version.o文件。我们可以使用以下命令将新对象文件添加到libcipher.a库中。该 -v (详细)选项使通常保持沉默 AR 告诉我们它做了什么。

ar -rsv libcipher.a cipher_version.o

终端窗口中的ar -rsv libcipher.a cipher_version.o

新对象文件将添加到库文件中。 AR 打印出确认。 “a”表示“已添加”。

在终端窗口中从ar输出

我们可以使用 -t (table)选项,用于查看库文件中的模块。

ar -t libcipher.a

ar -t libcipher.a在终端窗口中

我们的库文件中现在有三个模块。让我们使用新功能。

使用cipher_version()函数。

让我们从测试目录中删除旧的库和头文件,复制新文件,然后更改回测试目录。

我们将删除旧版本的文件。

rm ./test/libcipher.*

我们将新版本复制到测试目录中。

cp libcipher。* ./ test

我们将更改为测试目录。

cd测试

rm ./test/libcipher.*在终端窗口中

现在我们可以修改test.c程序,以便它使用新的库函数。

我们需要在调用的test.c程序中添加一个新行 cipher_version() 功能。我们会在第一个之前放置它 放(文本); 线。

#包括
#包括

#include“libcipher.h”

int main(int argc,char * argv())

 char text()=“How-To Geek喜欢Linux”;

 //这里添加了新行
 cipher_version();

 放(文本);
 
 cipher_encode(文本);
 放(文本);
 
 cipher_decode(文本);
 放(文本);

 退出(0);

//主要结束

将其保存为test.c.我们现在可以编译它并测试新功能是否可操作。

gcc test.c libcipher.a -o test

gcc test.c libcipher.a -o在终端窗口中进行测试

我们来运行新版本 测试

终端窗口中测试程序的输出

新功能正在运行。我们可以在输出的开头看到库的版本 测试

但可能存在问题。

替换库中的模块

这不是图书馆的第一个版本;这是第二个。我们的版本号不正确。第一个版本没有 cipher_version() 功能在其中。这一个。所以这应该是版本“0.0.2”。我们需要更换 cipher_version() 具有更正的库中的函数。

值得庆幸的是, AR 这很容易做到。

首先,让我们编辑库目录中的cipher_version.c文件。将“Version 0.0.1 Alpha”文本更改为“Version 0.0.2 Alpha”。它应该如下所示:

#包括

void cipher_version(void)

puts(“How-To Geek ::非常不安全的密码库”);
puts(“Version 0.0.2 Alpha n”);

// cipher_version的结尾

保存此文件。我们需要再次编译它以创建一个新的cipher_version.o目标文件。

gcc -c cipher_version.c

终端窗口中的gcc -c cipher_version.c

现在我们将使用新编译的版本替换库中现有的cipher_version.o对象。

我们用过了 -r (之前添加替换)选项,用于向库中添加新模块。当我们将它与库中已存在的模块一起使用时, AR 将用新版本替换旧版本。该 -s (index)选项将更新库索引和 -v (详细)选项将使 AR 告诉我们它做了什么。

ar -rsv libcipher.a cipher_version.o

终端窗口中的ar -rsv libcipher.a cipher_version.o

这次 AR 报告说它已经取代了cipher_version.o模块。 “r”表示已更换。

ar在终端窗口中输出

使用Updated cipher_version()函数

我们应该使用我们修改过的库并检查它是否有效。

我们将库文件复制到测试目录。

cp libcipher。* ./ test

我们将更改为测试目录。

cd ./test

我们需要使用新库再次编译我们的测试程序。

gcc test.c libcipher.a -o test

现在我们可以测试我们的程序。

。/测试

终端窗口中的cp libcipher。* ./test

测试程序的输出是我们所期望的。版本字符串中显示正确的版本号,加密和解密例程正在运行。

从库中删除模块

毕竟这看起来很遗憾,但是让我们从库文件中删除cipher_version.o文件。

要做到这一点,我们将使用 -d (删除)选项。我们也会使用 -v (详细)选项,这样 AR 告诉我们它做了什么。我们还将包括 -s (index)选项更新库文件中的索引。

ar -dsv libcipher.a cipher_version.o

终端窗口中的ar -dsv libcipher.a cipher_version.o

AR 报告已删除该模块。 “d”表示“已删除”。

如果我们问 AR 列出库文件中的模块,我们将看到我们回到了两个模块。

ar -t libcipher.a

ar -t libcipher.a在终端窗口中

如果要从库中删除模块,请记住从库头文件中删除它们的定义。

分享您的代码

库使代码以实用但私密的方式共享。您提供库文件和头文件的任何人都可以使用您的库,但您的实际源代码仍然是私有的。

body #primary .entry-content ul#nextuplist list-style-type:none; margin-left:0px; padding-left:0px;
body #primary .entry-content ul#nextuplist li a text-decoration:none; color:#1d55a9;

请阅读下一步

  • >怎样流UFC格斗之夜155 de Randamie vs. Ladd Online
  • >怎样加快您的Internet连接速度
  • >怎样将Alexa添加到智能镜像
  • >怎样在Linux上使用GPG加密和解密文件
  • >犯罪分子怎样以您的名义订购电话(以及怎样阻止他们)
本文机器自动生成,不保证语句完整通顺和表达准确,亦不对内容真实有效性负责,请读者知悉。