在开发软件时,使用Linux的ar命令创建函数库。本教程将向您展示如何创建、修改静态库,以及如何在程序中使用静态库,并提供示例代码。
ar司令部是一个真正的老兵,从1971年就开始了。ar这个名称引用了该工具最初的预期用途,即创建归档文件。存档文件是充当其他文件容器的单个文件。有时是为了其他文件。可以将文件添加到存档中、从存档中删除或从存档中提取文件。寻找这类功能的人不再求助于ar,这个角色已经被tar等其他实用工具所取代。
不过,ar命令仍有一些特殊用途。ar用于创建静态库。这些用于软件开发。ar还可用于创建包文件,如Debian Linux发行版中使用的“.deb”文件及其派生版本(如Ubuntu)。
我们将运行创建和修改静态库所需的步骤,并演示如何在程序中使用该库。为此,我们需要静态库满足一个要求。这个库的目的是对文本字符串进行编码和对编码文本进行解码。
请注意,这是一个快速和肮脏的黑客演示目的。不要对任何有价值的东西使用这种加密。它是世界上最简单的替换密码,其中A变成B,B变成C,依此类推。
相关:如何在Linux上使用tar命令压缩和提取文件
我们将在一个名为“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的短文本文件。这是一个头文件,包含新库中两个函数的定义。
任何拥有库和头文件的人都可以在自己的程序中使用这两个函数。他们不需要重新发明轮子和重新编写函数;他们只需要利用我们图书馆的副本。
为了编译源代码文件,我们将使用gcc,标准GNU编译器。c(compile,no link)选项告诉gcc编译文件,然后停止。它从每个源代码文件生成一个称为对象文件的中间文件。gcc链接器通常获取所有的对象文件并将它们链接在一起,从而生成一个可执行程序。我们使用-c选项跳过了这一步。我们只需要目标文件。
让我们检查一下我们有我们认为我们有的文件。
ls -l这两个源代码文件存在于这个目录中。让我们使用gcc将它们编译成对象文件。
gcc -c cipher_encode.c gcc -c cipher_decode.c如果一切顺利,gcc不应该有任何输出。
这将生成两个与源代码文件同名但扩展名为“.o”的对象文件。这些是我们需要添加到库文件中的文件。
ls -l要创建实际上是存档文件的库文件,我们将使用ar。
我们使用-c(create)选项创建库文件,-r(addwithreplace)选项将文件添加到库文件中,-s(index)选项创建库文件中文件的索引。
我们将调用库文件libcipher.a。我们在命令行中提供该名称,以及要添加到库中的对象文件的名称。
ar -crs libcipher.a cipher_encode.o cipher_decode.o如果我们列出目录中的文件,我们将看到我们现在有一个libcipher.a文件。
长征-长征
如果我们在ar中使用-t(table)选项,我们可以看到库文件中的模块。
ar -t libcipher.alibcipher.h文件将包含在任何使用libcipher.a库的程序中。libcipher.h文件必须包含库中函数的定义。
要创建头文件,我们必须在文本编辑器(如gedit)中键入函数定义。将文件命名为“libcipher.h”,并将其保存在与libcipher.a文件相同的目录中。
void cipher_encode(char *text); void cipher_decode(char *text);测试我们的新库的唯一可靠方法就是编写一个小程序来使用它。首先,我们将创建一个名为test的目录。
mkdir test我们将把库和头文件复制到新目录中。
cp libcipher.* ./test我们将换到新目录。
cd test让我们检查一下我们的两份文件在这里。
ls -l我们需要创建一个可以使用库的小程序,并证明它按预期运行。在编辑器中键入以下文本行。将编辑器的内容保存到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程序流程非常简单:
为了生成测试程序,我们需要编译test.c程序和库中的链接。-o(output)选项告诉gcc如何调用它生成的可执行程序。
gcc test.c libcipher.a -o test如果gcc静默地将您返回到命令提示符,则一切正常。现在让我们测试一下我们的程序。关键时刻:
./test我们看到了预期的产出。测试程序打印纯文本打印加密文本,然后打印解密文本。它正在使用我们新图书馆中的函数。我们的图书馆在工作。
成功。但为什么停在那里?
让我们向库中添加另一个函数。我们将添加一个函数,程序员可以使用它来显示他们正在使用的库的版本。我们需要创建新函数,编译它,并将新的对象文件添加到现有的库文件中。
在编辑器中键入以下行。将编辑器的内容保存到库目录中名为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这将创建一个cipher\u version.o文件。我们可以使用以下命令将新的对象文件添加到libcipher.a库中。v(verbose)选项使通常沉默的ar告诉我们它做了什么。
ar -rsv libcipher.a cipher_version.o新的对象文件将添加到库文件中。ar打印确认书。“a”表示“添加”
我们可以使用-t(table)选项来查看库文件中有哪些模块。
ar -t libcipher.a我们的库文件中现在有三个模块。让我们利用这个新函数。
让我们从测试目录中删除旧的库和头文件,复制新文件,然后更改回测试目录。
我们将删除文件的旧版本。
rm ./test/libcipher.*我们将把新版本复制到测试目录中。
cp libcipher.* ./test我们将切换到测试目录。
cd test现在我们可以修改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让我们运行新版本的测试:
新功能正在运行。我们可以在测试输出的开始处看到库的版本。
但可能有问题。
这不是图书馆的第一个版本,而是第二个版本。我们的版本号不正确。第一个版本中没有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现在,我们将用新编译的版本替换库中现有的cipher\u version.o对象。
我们以前使用过-r(addwithreplace)选项,将新模块添加到库中。当我们将它与库中已经存在的模块一起使用时,ar将用新版本替换旧版本。-s(index)选项将更新库索引,-v(verbose)选项将使ar告诉我们它做了什么。
ar -rsv libcipher.a cipher_version.o这次ar报告它已经替换了cipher\u version.o模块。“r”表示替换。
我们应该使用修改过的库并检查它是否有效。
我们将把库文件复制到测试目录。
cp libcipher.* ./test我们将切换到测试目录。
cd ./test我们需要用新的库重新编译测试程序。
gcc test.c libcipher.a -o test现在我们可以测试我们的程序了。
./test测试程序的输出是我们所期望的。版本字符串中显示了正确的版本号,并且加密和解密例程正在工作。
看起来很遗憾,但是让我们从库文件中删除cipher\u version.o文件。
为此,我们将使用-d(delete)选项。我们还将使用-v(verbose)选项,以便ar告诉我们它做了什么。我们还将包括-s(index)选项来更新库文件中的索引。
ar -dsv libcipher.a cipher_version.oar报告已移除模块。“d”表示“已删除”
如果我们让ar列出库文件中的模块,我们将看到返回到两个模块。
ar -t libcipher.a如果要从库中删除模块,请记住从库头文件中删除它们的定义。
库使代码以实用但私密的方式共享。您将库文件和头文件提供给的任何人都可以使用您的库,但您的实际源代码仍然是私有的。
在任何平台上,加密都是每个人都应该认真对待的事情。你可能认为你在Linux上比在Windows甚至macOS上更安全。但是Linux真的像你想象的那样安全吗? ...
...程语言的背景,你可能会发现这些建设者中的一个更容易使用。 ...
...GitHub页面就是这样一种选择,在本文中,我们将向您展示如何****GitHub页面托管一个简单的网站。 ...
...绍什么是静态站点生成器(SSG),为什么要使用它,以及如何使用它构建一个全新的站点。我们将探讨的一些细节: ...
...您仍然可以使用第三方资源在Arch上安装Steam。我们将讨论如何在Arch上下载Steam,以及如何解决安装期间或之后可能出现的一些常见问题。 ...
想在Arch Linux上安装软件包但不知道如何安装?很多人在第一次从基于Debian的发行版迁移到Arch时都面临这个问题。但是,您可以使用包管理器在基于Arch的系统上轻松地管理包。 ...
... 请继续阅读,了解如何在不丢失文件或配置的情况下安全地完成升级过程。 ...
... 无论您是Python编程新手还是专家,让我们来看看您如何在Android设备上充分发挥pydroid3的潜力。 ...
...歌云存储 赫罗库 GitLab页面 Netlify公司 莫索 浪涌 相关:如何在谷歌Firebase托管平台上免费托管静态网站 安装雨果 与雨果一起,你需要安装Git。Git已经安装在Fedora32和Manjaro20.0.1上。在ubuntu20.04(focusa,)上,它被自动添加为Hugo的...