如何使用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加密和解密文件
  • >犯罪分子怎樣以您的名義訂購電話(以及怎樣阻止他們)
本文機器自動生成,不保證語句完整通順和表達準確,亦不對內容真實有效性負責,請讀者知悉。