Jak používat příkaz ar Linuxu k vytváření statických knihoven

Při vývoji softwaru použijte příkaz ar Linuxu k vytvoření knihovny funkcí. Tento tutoriál vám ukáže, jak vytvořit statickou knihovnu, upravit ji a použít v programu, včetně ukázkového kódu.

Příkaz ar je skutečným veteránem – existuje již od roku 1971. Název ar odkazuje na původní zamýšlené použití nástroje, které bylo k vytvoření archivních souborů. Archivní soubor je jeden soubor, který funguje jako kontejner pro jiné soubory. Někdy pro mnoho dalších souborů. Soubory lze do archivu přidávat, odstraňovat z něj nebo z něj extrahovat. Lidé, kteří hledají tento typ funkcí, se již neobracejí na ar. Tuto roli převzaly jiné služby, jako je tar.

Příkaz ar se však stále používá pro několik speciálních účelů. ar se používá k vytváření statických knihoven. Ty se používají při vývoji softwaru. A ar se také používá k vytváření souborů balíčků, jako jsou soubory „.deb“ používané v distribuci Debian Linux a jejích derivátech, jako je Ubuntu.

Projdeme si kroky potřebné k vytvoření a úpravě statické knihovny a předvedeme, jak používat knihovnu v programu. K tomu potřebujeme požadavek, který musí statická knihovna splnit. Účelem této knihovny je kódování řetězců textu a dekódování zakódovaného textu.

Upozorňujeme, že se jedná o rychlý a špinavý hack pro demonstrační účely. Nepoužívejte toto šifrování pro nic, co má hodnotu. Je to nejjednodušší na světě substituční šifra, kde A se stane B, B se stane C a tak dále.

Funkce cipher_encode() a cipher_decode().

Budeme pracovat v adresáři s názvem „library“ a později vytvoříme podadresář s názvem „test“.

V tomto adresáři máme dva soubory. V textovém souboru s názvem cipher_encode.c máme funkci cipher_encode():

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

} // end of cipher_encode

Odpovídající funkce cipher_decode() je v textovém souboru s názvem cipher_decode.c:

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

} // end of cipher_decode

Soubory, které obsahují programovací instrukce, se nazývají soubory zdrojového kódu. Vytvoříme soubor knihovny s názvem libcipher.a. Bude obsahovat zkompilované verze těchto dvou souborů zdrojového kódu. Vytvoříme také krátký textový soubor s názvem libcipher.h. Toto je hlavičkový soubor obsahující definice dvou funkcí v naší nové knihovně.

Kdokoli s knihovnou a hlavičkovým souborem bude moci používat tyto dvě funkce ve svých vlastních programech. Nepotřebují znovu vymýšlet kolo a přepisovat funkce; jednoduše využívají kopie v naší knihovně.

  Jak přidat fotografie na domovskou obrazovku iPhone

Kompilace souborů cipher_encode.ca cipher_decode.c

Ke kompilaci souborů zdrojového kódu použijeme gcc, the standardní GNU kompilátor. Volba -c (kompilovat, bez odkazu) říká gcc, aby zkompiloval soubory a pak se zastavil. Vytváří zprostředkující soubor z každého souboru zdrojového kódu, který se nazývá objektový soubor. Linker gcc obvykle vezme všechny soubory objektů a spojí je dohromady, aby vytvořil spustitelný program. Tento krok přeskočíme použitím volby -c. Potřebujeme pouze soubory objektů.

Zkontrolujeme, že máme soubory, o kterých si myslíme, že máme.

ls -l

V tomto adresáři jsou umístěny dva soubory zdrojového kódu. Pomocí gcc je zkompilujeme do objektových souborů.

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

Pokud vše půjde dobře, z gcc by neměl být žádný výstup.

Tím se vygenerují dva objektové soubory se stejným názvem jako soubory zdrojového kódu, ale s příponou „.o“. Toto jsou soubory, které musíme přidat do souboru knihovny.

ls -l

Vytvoření knihovny libcipher.a

K vytvoření souboru knihovny – což je vlastně archivní soubor – použijeme ar.

K vytvoření souboru knihovny používáme volbu -c (vytvořit), volbu -r (přidat s nahradit) k přidání souborů do souboru knihovny a volbu -s (index) k vytvoření indexu souborů uvnitř. soubor knihovny.

Soubor knihovny nazveme libcipher.a. Toto jméno poskytujeme na příkazovém řádku spolu s názvy souborů objektů, které se chystáme přidat do knihovny.

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

Pokud vypíšeme soubory v adresáři, uvidíme, že nyní máme soubor libcipher.a.

ls -l

Pokud použijeme volbu -t (tabulka) s ar, můžeme vidět moduly uvnitř souboru knihovny.

ar -t libcipher.a

Vytvoření hlavičky libcipher.h Soubor

Soubor libcipher.h bude součástí každého programu, který používá knihovnu libcipher.a. Soubor libcipher.h musí obsahovat definici funkcí, které jsou v knihovně.

Abychom vytvořili hlavičkový soubor, musíme zadat definice funkcí do textového editoru, jako je gedit. Soubor pojmenujte „libcipher.h“ a uložte jej do stejného adresáře jako soubor libcipher.a.

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

Použití knihovny libcipher

Jediný jistý způsob, jak otestovat naši novou knihovnu, je napsat malý program, který ji bude používat. Nejprve vytvoříme adresář s názvem test.

mkdir test

Knihovnu a hlavičkové soubory zkopírujeme do nového adresáře.

cp libcipher.* ./test

Přejdeme do nového adresáře.

cd test

Zkontrolujeme, že jsou zde naše dva soubory.

ls -l

Potřebujeme vytvořit malý program, který může používat knihovnu a prokázat, že funguje podle očekávání. Zadejte následující řádky textu do editoru. Uložte obsah editoru do souboru s názvem „test.c“ v adresáři test.

#include 
#include 

#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

Průběh programu je velmi jednoduchý:

  Pine je krásný správce záložek umístěný zcela ve vašem prohlížeči [Chrome]

Obsahuje soubor libcipher.h, takže může vidět definice funkcí knihovny.
Vytvoří řetězec nazvaný „text“ a uloží do něj slova „How-To Geek loves Linux“.
Vytiskne tento řetězec na obrazovku.
zavolá funkci cipher_encode() pro zakódování řetězce a vypíše zakódovaný řetězec na obrazovku.
Zavolá cipher_decode() k dekódování řetězce a vypíše dekódovaný řetězec na obrazovku.

Pro vygenerování testovacího programu musíme zkompilovat program test.c a propojit v knihovně. Volba -o (výstup) říká gcc, jak má volat spustitelný program, který generuje.

gcc test.c libcipher.a -o test

Pokud vás gcc tiše vrátí do příkazového řádku, je vše v pořádku. Nyní otestujeme náš program. Okamžik pravdy:

./test

A vidíme očekávaný výstup. Testovací program vytiskne prostý text, vytiskne zašifrovaný text a poté vytiskne dešifrovaný text. Využívá funkce naší nové knihovny. Naše knihovna funguje.

Úspěch. Ale proč se tam zastavit?

Přidání dalšího modulu do knihovny

Přidejme do knihovny další funkci. Přidáme funkci, kterou může programátor použít k zobrazení verze knihovny, kterou používá. Budeme muset vytvořit novou funkci, zkompilovat ji a přidat nový objektový soubor do existujícího souboru knihovny.

Zadejte následující řádky do editoru. Uložte obsah editoru do souboru s názvem cipher_version.c v adresáři knihovny.

#include 

void cipher_version(void)
{
 puts("How-To Geek :: VERY INSECURE Cipher Library");
 puts("Version 0.0.1 Alphan");

} // end of cipher_version

Potřebujeme přidat definici nové funkce do hlavičkového souboru libcipher.h. Přidejte nový řádek na konec tohoto souboru, aby vypadal takto:

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

Uložte upravený soubor libcipher.h.

Potřebujeme zkompilovat soubor cipher_version.c, abychom měli objektový soubor cipher_version.o.

gcc -c cipher_version.c

Tím se vytvoří soubor cipher_version.o. Nový objektový soubor můžeme přidat do knihovny libcipher.a následujícím příkazem. Volba -v (verbózní) způsobí, že obvykle tichý ar nám řekne, co udělal.

ar -rsv libcipher.a cipher_version.o

Nový objektový soubor je přidán do souboru knihovny. ar vytiskne potvrzení. „A“ znamená „přidáno“.

Můžeme použít volbu -t (tabulka), abychom viděli, jaké moduly jsou uvnitř souboru knihovny.

ar -t libcipher.a

V souboru naší knihovny jsou nyní tři moduly. Pojďme využít novou funkci.

Pomocí funkce cipher_version().

Odstraníme starou knihovnu a hlavičkový soubor z testovacího adresáře, zkopírujeme nové soubory a poté se změníme zpět do testovacího adresáře.

Smažeme staré verze souborů.

rm ./test/libcipher.*

Nové verze zkopírujeme do adresáře test.

cp libcipher.* ./test

Přejdeme do adresáře test.

cd test

A nyní můžeme upravit program test.c tak, aby používal novou knihovní funkci.

Potřebujeme přidat nový řádek do programu test.c, který volá funkci cipher_version(). Umístíme to před první puts(text); čára.

#include 
#include  

#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

Uložte to jako test.c. Nyní ji můžeme zkompilovat a otestovat, že je nová funkce funkční.

gcc test.c libcipher.a -o test

Spusťte novou verzi testu:

  Proč lidé vypadají jinak na fotografiích pořízených různými objektivy

Nová funkce funguje. Verzi knihovny vidíme na začátku výstupu z testu.

Může ale nastat problém.

Výměna modulu v knihovně

Toto není první verze knihovny; je to druhé. Naše číslo verze je nesprávné. První verze v sobě neměla žádnou funkci cipher_version(). Tento ano. Měla by to být verze „0.0.2“. Musíme nahradit funkci cipher_version() v knihovně opravenou.

Naštěstí to ar velmi usnadňuje.

Nejprve upravíme soubor cipher_version.c v adresáři knihovny. Změňte text „Version 0.0.1 Alpha“ na „Version 0.0.2 Alpha“. Mělo by to vypadat takto:

#include 

void cipher_version(void)
{
 puts("How-To Geek :: VERY INSECURE Cipher Library");  
 puts("Version 0.0.2 Alphan"); 

} // end of cipher_version

Uložte tento soubor. Musíme jej znovu zkompilovat, abychom vytvořili nový objektový soubor cipher_version.o.

gcc -c cipher_version.c

Nyní nahradíme stávající objekt cipher_version.o v knihovně naší nově zkompilovanou verzí.

K přidání nových modulů do knihovny jsme již dříve použili volbu -r (přidat s nahradit). Když jej použijeme s modulem, který již v knihovně existuje, nahradí ar starou verzi novou. Volba -s (index) aktualizuje index knihovny a volba -v (podrobné) nám řekne, co udělala.

ar -rsv libcipher.a cipher_version.o

Tentokrát ar hlásí, že nahradil modul cipher_version.o. „r“ znamená nahrazeno.

Pomocí funkce Updated cipher_version().

Měli bychom použít naši upravenou knihovnu a zkontrolovat, zda funguje.

Soubory knihovny zkopírujeme do adresáře test.

cp libcipher.* ./test

Přejdeme do adresáře test.

cd ./test

Musíme znovu zkompilovat náš testovací program s naší novou knihovnou.

gcc test.c libcipher.a -o test

A nyní můžeme náš program otestovat.

./test

Výstup z testovacího programu je takový, jaký jsme očekávali. V řetězci verze se zobrazuje správné číslo verze a rutiny šifrování a dešifrování fungují.

Odstranění modulů z knihovny

Zdá se to po tom všem škoda, ale smažte soubor cipher_version.o ze souboru knihovny.

K tomu použijeme volbu -d (smazat). Použijeme také volbu -v (verbose), takže ar nám řekne, co udělal. Zahrneme také volbu -s (index) pro aktualizaci indexu v souboru knihovny.

ar -dsv libcipher.a cipher_version.o

ar hlásí, že modul odstranil. „d“ znamená „smazáno“.

Pokud požádáme ar o výpis modulů uvnitř souboru knihovny, uvidíme, že jsme zpět u dvou modulů.

ar -t libcipher.a

Pokud se chystáte odstranit moduly ze své knihovny, nezapomeňte odstranit jejich definici ze souboru záhlaví knihovny.

Sdílejte svůj kód

Knihovny umožňují sdílení kódu praktickým, ale soukromým způsobem. Kdokoli, komu dáte soubor knihovny a soubor záhlaví, může vaši knihovnu používat, ale váš skutečný zdrojový kód zůstane soukromý.