在開發軟體時,使用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如果要從庫中刪除模組,請記住從庫標頭檔案中刪除它們的定義。
庫使程式碼以實用但私密的方式共享。您將庫檔案和標頭檔案提供給的任何人都可以使用您的庫,但您的實際原始碼仍然是私有的。
... 讓我們看看軟體是如何安裝在三大桌面平臺上的:Windows、macOS和Linux。 ...
...式語言的背景,你可能會發現這些建設者中的一個更容易使用。 ...
... 讓我們看看如何在計算機中建立Instapaper或Pocket的克隆,而不會丟失任何網頁資源。 ...
... 下面介紹如何在本地和web上的Raspberry Pi和宿主網站上設定Apache、MySQL和PHP。 ...
...紹什麼是靜態站點生成器(SSG),為什麼要使用它,以及如何使用它構建一個全新的站點。我們將探討的一些細節: ...
想在Linux系統上新增使用者但不知道如何新增?在Linux上使用命令列介面管理使用者無疑是一項複雜的工作。而對於初學者來說,即使新增新使用者也是一場噩夢。 ...