如何使用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
  • 閱讀 ( 34 )
  • 分類:網際網路

你可能感興趣的文章

關於基於golang的惡意軟體,您需要了解什麼

...雖然有很多這樣惡劣的資訊竊取者,使這一個更陰險的是如何針對多個作業系統。 ...

  • 發佈於 2021-03-11 10:52
  • 閲讀 ( 63 )

這就是軟體安裝程式在windows、macos和linux上的工作方式

... 讓我們看看軟體是如何安裝在三大桌面平臺上的:Windows、macOS和Linux。 ...

  • 發佈於 2021-03-14 18:20
  • 閲讀 ( 45 )

如何用舊計算機構建linux網路伺服器

... 下面介紹如何設定Linux web伺服器。 ...

  • 發佈於 2021-03-17 19:20
  • 閲讀 ( 54 )

jekyll vs.gatsbyjs:哪個靜態網站構建者構建了最好的網站?

...式語言的背景,你可能會發現這些建設者中的一個更容易使用。 ...

  • 發佈於 2021-03-19 02:43
  • 閲讀 ( 43 )

如何建立自己的私有自託管ReadItLater應用程式

... 讓我們看看如何在計算機中建立Instapaper或Pocket的克隆,而不會丟失任何網頁資源。 ...

  • 發佈於 2021-03-19 09:29
  • 閲讀 ( 53 )

如何在raspberry pi上託管wordpress站點

... 下面介紹如何在本地和web上的Raspberry Pi和宿主網站上設定Apache、MySQL和PHP。 ...

  • 發佈於 2021-03-21 11:33
  • 閲讀 ( 43 )

如何在linux上管理ip地址:查詢、設定和更改

... 如何查詢您的ip地址和dns地址 ...

  • 發佈於 2021-03-24 17:34
  • 閲讀 ( 55 )

使用靜態站點生成器快速構建網站

...紹什麼是靜態站點生成器(SSG),為什麼要使用它,以及如何使用它構建一個全新的站點。我們將探討的一些細節: ...

  • 發佈於 2021-03-25 19:23
  • 閲讀 ( 62 )

如何在linux上使用groupadd管理使用者組

... 相關:如何在Linux中更改密碼 ...

  • 發佈於 2021-03-26 17:15
  • 閲讀 ( 39 )

如何在linux中新增使用者

想在Linux系統上新增使用者但不知道如何新增?在Linux上使用命令列介面管理使用者無疑是一項複雜的工作。而對於初學者來說,即使新增新使用者也是一場噩夢。 ...

  • 發佈於 2021-03-26 23:29
  • 閲讀 ( 63 )
銘心yy
銘心yy

0 篇文章

作家榜

  1. admin 0 文章
  2. 孫小欽 0 文章
  3. JVhby0 0 文章
  4. fvpvzrr 0 文章
  5. 0sus8kksc 0 文章
  6. zsfn1903 0 文章
  7. w91395898 0 文章
  8. SuperQueen123 0 文章

相關推薦