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

在开发软件时,使用Linux的ar命令创建函数库。本教程将向您展示如何创建、修改静态库,以及如何在程序中使用静态库,并提供示例代码。...

在开发软件时,使用Linux的ar命令创建函数库。本教程将向您展示如何创建、修改静态库,以及如何在程序中使用静态库,并提供示例代码。

ar司令部是一个真正的老兵,从1971年就开始了。ar这个名称引用了该工具最初的预期用途,即创建归档文件。存档文件是充当其他文件容器的单个文件。有时是为了其他文件。可以将文件添加到存档中、从存档中删除或从存档中提取文件。寻找这类功能的人不再求助于ar,这个角色已经被tar等其他实用工具所取代。

不过,ar命令仍有一些特殊用途。ar用于创建静态库。这些用于软件开发。ar还可用于创建包文件,如Debian Linux发行版中使用的“.deb”文件及其派生版本(如Ubuntu)。

我们将运行创建和修改静态库所需的步骤,并演示如何在程序中使用该库。为此,我们需要静态库满足一个要求。这个库的目的是对文本字符串进行编码和对编码文本进行解码。

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

相关:如何在Linux上使用tar命令压缩和提取文件

cipher\u encode()和cipher\u decode()函数

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

这个目录里有两个文件。在名为cipher\u encode.c的文本文件中,我们有cipher\u encode()函数:

void cipher_encode(char *text) { for (int i=0; text[i] != 0x0; i++) { text[i]++; } } // end of cipher_encode

相应的cipher\u decode()函数位于名为cipher\u decode.c的文本文件中:

void cipher_decode(char *text) { for (int i=0; text[i] != 0x0; i++) { text[i]--; } } // end of cipher_decode

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

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

编译cipher\u encode.c和cipher\u decode.c文件

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

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

ls -l

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

这两个源代码文件存在于这个目录中。让我们使用gcc将它们编译成对象文件。

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

如果一切顺利,gcc不应该有任何输出。

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

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

ls -l

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

创建libcipher.a库

要创建实际上是存档文件的库文件,我们将使用ar。

我们使用-c(create)选项创建库文件,-r(addwithreplace)选项将文件添加到库文件中,-s(index)选项创建库文件中文件的索引。

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

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

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

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

长征-长征

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

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

ar -t libcipher.a

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

创建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 test

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

cp libcipher.* ./test

我们将换到新目录。

cd test

让我们检查一下我们的两份文件在这里。

ls -l

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

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

#include <stdio.h> #include <stdlib.h> #include "libcipher.h" int main(int argc, char *argv[]) { char text[]="How-To Geek loves Linux"; puts(text); cipher_encode(text); puts(text); cipher_decode(text); puts(text); exit (0); } // end of main

程序流程非常简单:

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

为了生成测试程序,我们需要编译test.c程序和库中的链接。-o(output)选项告诉gcc如何调用它生成的可执行程序。

gcc test.c libcipher.a -o test

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

如果gcc静默地将您返回到命令提示符,则一切正常。现在让我们测试一下我们的程序。关键时刻:

./test

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

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

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

成功。但为什么停在那里?

向库中添加另一个模块

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

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

#include <stdio.h> void cipher_version(void) { puts("How-To Geek :: VERY INSECURE Cipher Library"); puts("Version 0.0.1 Alpha\n"); } // end of cipher_version

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

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

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

我们需要编译cipher\u version.c文件,以便有一个cipher\u version.o对象文件。

gcc -c cipher_version.c

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

这将创建一个cipher\u version.o文件。我们可以使用以下命令将新的对象文件添加到libcipher.a库中。v(verbose)选项使通常沉默的ar告诉我们它做了什么。

ar -rsv libcipher.a cipher_version.o

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

新的对象文件将添加到库文件中。ar打印确认书。“a”表示“添加”

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

我们可以使用-t(table)选项来查看库文件中有哪些模块。

ar -t libcipher.a

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

我们的库文件中现在有三个模块。让我们利用这个新函数。

使用cipher\u version()函数。

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

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

rm ./test/libcipher.*

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

cp libcipher.* ./test

我们将切换到测试目录。

cd test

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

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

我们需要在test.c程序中添加一行新代码来调用cipher\u version()函数。我们将把这个放在第一个put(文本);行之前。

#include <stdio.h> #include <stdlib.h> #include "libcipher.h" int main(int argc, char *argv[]) { char text[]="How-To Geek loves Linux"; // new line added here cipher_version(); puts(text); cipher_encode(text); puts(text); cipher_decode(text); puts(text); exit (0); } // end of main

将这个保存为test.c。我们现在可以编译它并测试新函数是否可操作。

gcc test.c libcipher.a -o test

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

让我们运行新版本的测试:

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

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

但可能有问题。

替换库中的模块

这不是图书馆的第一个版本,而是第二个版本。我们的版本号不正确。第一个版本中没有cipher\u version()函数。这个是。所以这应该是版本“0.0.2”。我们需要用正确的函数替换库中的cipher\u version()函数。

谢天谢地,ar使这件事很容易做到。

首先,编辑库目录中的cipher\u version.c文件。将“版本0.0.1 Alpha”文本更改为“版本0.0.2 Alpha”。应该是这样的:

#include <stdio.h> void cipher_version(void) { puts("How-To Geek :: VERY INSECURE Cipher Library"); puts("Version 0.0.2 Alpha\n"); } // end of cipher_version

保存此文件。我们需要再次编译它来创建一个新的cipher\u version.o对象文件。

gcc -c cipher_version.c

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

现在,我们将用新编译的版本替换库中现有的cipher\u version.o对象。

我们以前使用过-r(addwithreplace)选项,将新模块添加到库中。当我们将它与库中已经存在的模块一起使用时,ar将用新版本替换旧版本。-s(index)选项将更新库索引,-v(verbose)选项将使ar告诉我们它做了什么。

ar -rsv libcipher.a cipher_version.o

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

这次ar报告它已经替换了cipher\u version.o模块。“r”表示替换。

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

使用更新的cipher\u version()函数

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

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

cp libcipher.* ./test

我们将切换到测试目录。

cd ./test

我们需要用新的库重新编译测试程序。

gcc test.c libcipher.a -o test

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

./test

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

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

从库中删除模块

看起来很遗憾,但是让我们从库文件中删除cipher\u version.o文件。

为此,我们将使用-d(delete)选项。我们还将使用-v(verbose)选项,以便ar告诉我们它做了什么。我们还将包括-s(index)选项来更新库文件中的索引。

ar -dsv libcipher.a cipher_version.o

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

ar报告已移除模块。“d”表示“已删除”

如果我们让ar列出库文件中的模块,我们将看到返回到两个模块。

ar -t libcipher.a

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

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

分享你的代码

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

  • 发表于 2021-04-03 09:35
  • 阅读 ( 294 )
  • 分类:互联网

你可能感兴趣的文章

关于基于golang的恶意软件,您需要了解什么

...虽然有很多这样恶劣的信息窃取者,使这一个更阴险的是如何针对多个操作系统。 ...

  • 发布于 2021-03-11 10:52
  • 阅读 ( 295 )

如何在ubuntu中加密文件和文件夹

在任何平台上,加密都是每个人都应该认真对待的事情。你可能认为你在Linux上比在Windows甚至macOS上更安全。但是Linux真的像你想象的那样安全吗? ...

  • 发布于 2021-03-11 16:31
  • 阅读 ( 847 )

jekyll vs.gatsbyjs:哪个静态网站构建者构建了最好的网站?

...程语言的背景,你可能会发现这些建设者中的一个更容易使用。 ...

  • 发布于 2021-03-19 02:43
  • 阅读 ( 441 )

如何使用github页面免费托管网站

...GitHub页面就是这样一种选择,在本文中,我们将向您展示如何****GitHub页面托管一个简单的网站。 ...

  • 发布于 2021-03-19 05:27
  • 阅读 ( 219 )

使用静态站点生成器快速构建网站

...绍什么是静态站点生成器(SSG),为什么要使用它,以及如何使用它构建一个全新的站点。我们将探讨的一些细节: ...

  • 发布于 2021-03-25 19:23
  • 阅读 ( 306 )

用steam将arch-linux变成一个游戏系统

...您仍然可以使用第三方资源在Arch上安装Steam。我们将讨论如何在Arch上下载Steam,以及如何解决安装期间或之后可能出现的一些常见问题。 ...

  • 发布于 2021-03-26 21:06
  • 阅读 ( 256 )

如何在arch linux中安装和删除软件包

想在Arch Linux上安装软件包但不知道如何安装?很多人在第一次从基于Debian的发行版迁移到Arch时都面临这个问题。但是,您可以使用包管理器在基于Arch的系统上轻松地管理包。 ...

  • 发布于 2021-03-28 02:18
  • 阅读 ( 457 )

如何从linux mint 19.3升级到mint 20

... 请继续阅读,了解如何在不丢失文件或配置的情况下安全地完成升级过程。 ...

  • 发布于 2021-03-29 00:00
  • 阅读 ( 234 )

如何使用pydroid3在android上安装和编写python代码

... 无论您是Python编程新手还是专家,让我们来看看您如何在Android设备上充分发挥pydroid3的潜力。 ...

  • 发布于 2021-03-30 03:41
  • 阅读 ( 400 )

如何在linux上使用hugo静态站点生成器

...歌云存储 赫罗库 GitLab页面 Netlify公司 莫索 浪涌 相关:如何在谷歌Firebase托管平台上免费托管静态网站 安装雨果 与雨果一起,你需要安装Git。Git已经安装在Fedora32和Manjaro20.0.1上。在ubuntu20.04(focusa,)上,它被自动添加为Hugo的...

  • 发布于 2021-04-01 20:08
  • 阅读 ( 179 )
铭心yy
铭心yy

0 篇文章

相关推荐