Hvordan bruke Linuxs ar-kommando for å lage statiske biblioteker

Bruk Linuxs ar-kommando for å lage funksjonsbiblioteker når du utvikler programvare. Denne opplæringen viser deg hvordan du oppretter et statisk bibliotek, endrer det og bruker det i et program, komplett med eksempelkode.

ar-kommandoen er en ekte veteran – den har eksistert siden 1971. Navnet ar refererer til den opprinnelige tiltenkte bruken for verktøyet, som var for å lage arkivfiler. En arkivfil er en enkelt fil som fungerer som en beholder for andre filer. Noen ganger for mange andre filer. Filer kan legges til, fjernes fra eller trekkes ut fra arkivet. Folk som leter etter den typen funksjonalitet henvender seg ikke lenger til ar. Den rollen har blitt overtatt av andre verktøy som tjære.

ar-kommandoen brukes fortsatt til noen få spesialistformål. ar brukes til å lage statiske biblioteker. Disse brukes i programvareutvikling. Og ar brukes også til å lage pakkefiler som «.deb»-filene som brukes i Debian Linux-distribusjonen og dens derivater som Ubuntu.

Vi skal gå gjennom trinnene som kreves for å lage og endre et statisk bibliotek, og demonstrere hvordan du bruker biblioteket i et program. For å gjøre det trenger vi et krav som det statiske biblioteket skal oppfylle. Formålet med dette biblioteket er å kode tekststrenger og dekode kodet tekst.

Vær oppmerksom på at dette er et raskt og skittent hack for demonstrasjonsformål. Ikke bruk denne krypteringen til noe som er av verdi. Det er verdens enkleste erstatningssiffer, hvor A blir B, B blir C, og så videre.

Funksjonene cipher_encode() og cipher_decode()

Vi skal jobbe i en katalog kalt «bibliotek», og senere vil vi lage en underkatalog kalt «test.»

Vi har to filer i denne katalogen. I en tekstfil kalt cipher_encode.c har vi cipher_encode()-funksjonen:

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

} // end of cipher_encode

Den tilsvarende cipher_decode()-funksjonen er i en tekstfil kalt cipher_decode.c:

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

} // end of cipher_decode

Filer som inneholder programmeringsinstruksjoner kalles kildekodefiler. Vi skal lage en biblioteksfil som heter libcipher.a. Den vil inneholde de kompilerte versjonene av disse to kildekodefilene. Vi lager også en kort tekstfil kalt libcipher.h. Dette er en overskriftsfil som inneholder definisjonene av de to funksjonene i vårt nye bibliotek.

Alle som har biblioteket og header-filen vil kunne bruke de to funksjonene i sine egne programmer. De trenger ikke å finne opp hjulet på nytt og skrive om funksjonene; de bruker ganske enkelt kopiene i biblioteket vårt.

  Hva er pivottabeller i Google Regneark, og hvordan bruker jeg dem

Kompilere filene cipher_encode.c og cipher_decode.c

For å kompilere kildekodefilene bruker vi gcc, den standard GNU kompilator. Alternativet -c (kompiler, ingen lenke) forteller gcc å kompilere filene og deretter stoppe. Den produserer en mellomliggende fil fra hver kildekodefil kalt en objektfil. Gcc-linkeren tar vanligvis alle objektfilene og kobler dem sammen for å lage et kjørbart program. Vi hopper over det trinnet ved å bruke alternativet -c. Vi trenger bare objektfilene.

La oss sjekke at vi har filene vi tror vi har.

ls -l

De to kildekodefilene finnes i denne katalogen. La oss bruke gcc til å kompilere dem til objektfiler.

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

Det skal ikke være noe utdata fra gcc hvis alt går bra.

Dette genererer to objektfiler med samme navn som kildekodefilene, men med «.o»-utvidelser. Dette er filene vi må legge til i bibliotekfilen.

ls -l

Opprette biblioteket libcipher.a

For å lage bibliotekfilen – som faktisk er en arkivfil – bruker vi ar.

Vi bruker alternativet -c (opprett) for å lage biblioteksfilen, -r (legg til med erstatning) alternativet for å legge til filene i bibliotekfilen, og -s (indeks) alternativet for å lage en indeks over filene inne i bibliotekfilen.

Vi skal kalle bibliotekfilen libcipher.a. Vi oppgir det navnet på kommandolinjen, sammen med navnene på objektfilene vi skal legge til i biblioteket.

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

Hvis vi viser filene i katalogen, vil vi se at vi nå har en libcipher.a-fil.

ls -l

Hvis vi bruker alternativet -t (tabell) med ar kan vi se modulene inne i bibliotekfilen.

ar -t libcipher.a

Opprette libcipher.h header-filen

Filen libcipher.h vil bli inkludert i alle programmer som bruker biblioteket libcipher.a. Filen libcipher.h må inneholde definisjonen av funksjonene som er i biblioteket.

For å lage overskriftsfilen må vi skrive inn funksjonsdefinisjonene i et tekstredigeringsprogram, for eksempel gedit. Gi filen navnet «libcipher.h» og lagre den i samme katalog som filen libcipher.a.

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

Bruker libcipher Library

Den eneste sikre måten å teste vårt nye bibliotek på er å skrive et lite program for å bruke det. Først skal vi lage en katalog som heter test.

mkdir test

Vi kopierer biblioteket og overskriftsfilene til den nye katalogen.

cp libcipher.* ./test

Vi bytter til den nye katalogen.

cd test

La oss sjekke at de to filene våre er her.

ls -l

Vi må lage et lite program som kan bruke biblioteket og bevise at det fungerer som forventet. Skriv inn følgende tekstlinjer i et redigeringsprogram. Lagre innholdet i editoren til en fil som heter «test.c» i testkatalogen.

#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

Programflyten er veldig enkel:

Den inkluderer filen libcipher.h slik at den kan se bibliotekfunksjonsdefinisjonene.
Den lager en streng kalt «tekst» og lagrer ordene «How-To Geek elsker Linux» i den.
Den skriver ut den strengen på skjermen.
den kaller cipher_encode()-funksjonen for å kode strengen, og den skriver ut den kodede strengen til skjermen.
Den kaller cipher_decode() for å dekode strengen og skriver ut den dekodede strengen til skjermen.

  Hvordan finne tilgjengelige transittruter på Google Maps

For å generere testprogrammet må vi kompilere test.c-programmet og lenke i biblioteket. Alternativet -o (output) forteller gcc hva den skal kalle det kjørbare programmet som det genererer.

gcc test.c libcipher.a -o test

Hvis gcc stille returnerer deg til ledeteksten, er alt bra. La oss nå teste programmet vårt. Sannhetens øyeblikk:

./test

Og vi ser forventet produksjon. Testprogrammet skriver ut ren tekst skriver ut den krypterte teksten og skriver deretter ut den dekrypterte teksten. Den bruker funksjonene i vårt nye bibliotek. Biblioteket vårt fungerer.

Suksess. Men hvorfor stoppe der?

Legge til en annen modul til biblioteket

La oss legge til en annen funksjon til biblioteket. Vi legger til en funksjon som programmereren kan bruke for å vise versjonen av biblioteket de bruker. Vi må lage den nye funksjonen, kompilere den og legge til den nye objektfilen til den eksisterende bibliotekfilen.

Skriv inn følgende linjer i en editor. Lagre innholdet i editoren til en fil som heter cipher_version.c, i bibliotekskatalogen.

#include 

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

} // end of cipher_version

Vi må legge til definisjonen av den nye funksjonen til libcipher.h header-filen. Legg til en ny linje nederst i den filen, slik at den ser slik ut:

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

Lagre den modifiserte libcipher.h-filen.

Vi må kompilere cipher_version.c-filen slik at vi har en cipher_version.o objektfil.

gcc -c cipher_version.c

Dette oppretter en cipher_version.o-fil. Vi kan legge til den nye objektfilen til libcipher.a-biblioteket med følgende kommando. Alternativet -v (verbose) får den vanligvis stille ar til å fortelle oss hva den har gjort.

ar -rsv libcipher.a cipher_version.o

Den nye objektfilen legges til bibliotekfilen. ar skriver ut bekreftelse. «a» betyr «lagt til.»

Vi kan bruke alternativet -t (tabell) for å se hvilke moduler som er inne i bibliotekfilen.

ar -t libcipher.a

Det er nå tre moduler inne i bibliotekfilen vår. La oss bruke den nye funksjonen.

Bruke cipher_version()-funksjonen.

La oss fjerne det gamle biblioteket og overskriftsfilen fra testkatalogen, kopiere inn de nye filene og deretter bytte tilbake til testkatalogen.

Vi sletter de gamle versjonene av filene.

rm ./test/libcipher.*

Vi kopierer de nye versjonene til testkatalogen.

cp libcipher.* ./test

Vi bytter til testkatalogen.

cd test

Og nå kan vi endre test.c-programmet slik at det bruker den nye bibliotekfunksjonen.

Vi må legge til en ny linje i test.c-programmet som kaller cipher_version()-funksjonen. Vi plasserer dette før de første puts(tekst); linje.

#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

Lagre dette som test.c. Vi kan nå kompilere den og teste at den nye funksjonen er operativ.

gcc test.c libcipher.a -o test

La oss kjøre den nye versjonen av testen:

  Slik sikkerhetskopierer og gjenoppretter du iPhone eller iPad uten iTunes

Den nye funksjonen fungerer. Vi kan se versjonen av biblioteket i starten av utdata fra test.

Men det kan være et problem.

Bytte ut en modul i biblioteket

Dette er ikke den første versjonen av biblioteket; det er den andre. Vårt versjonsnummer er feil. Den første versjonen hadde ingen cipher_version()-funksjon i seg. Denne gjør det. Så dette bør være versjon «0.0.2». Vi må erstatte cipher_version()-funksjonen i biblioteket med en korrigert.

Heldigvis gjør ar det veldig enkelt å gjøre.

Først, la oss redigere cipher_version.c-filen i bibliotekskatalogen. Endre teksten «Versjon 0.0.1 Alpha» til «Versjon 0.0.2 Alpha». Det skal se slik ut:

#include 

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

} // end of cipher_version

Lagre denne filen. Vi må kompilere den på nytt for å lage en ny cipher_version.o objektfil.

gcc -c cipher_version.c

Nå vil vi erstatte det eksisterende cipher_version.o-objektet i biblioteket med vår nylig kompilerte versjon.

Vi har brukt alternativet -r (legg til med erstatning) før, for å legge til nye moduler til biblioteket. Når vi bruker den med en modul som allerede finnes i biblioteket, vil ar erstatte den gamle versjonen med den nye. Alternativet -s (indeks) vil oppdatere bibliotekindeksen og -v (verbose) alternativet vil få ar til å fortelle oss hva det har gjort.

ar -rsv libcipher.a cipher_version.o

Denne gangen rapporterer ar at den har erstattet cipher_version.o-modulen. «r» betyr erstattet.

Bruke funksjonen Oppdatert cipher_version()

Vi bør bruke vårt modifiserte bibliotek og sjekke at det fungerer.

Vi vil kopiere bibliotekfilene til testkatalogen.

cp libcipher.* ./test

Vi bytter til testkatalogen.

cd ./test

Vi må kompilere testprogrammet vårt igjen med vårt nye bibliotek.

gcc test.c libcipher.a -o test

Og nå kan vi teste programmet vårt.

./test

Resultatet fra testprogrammet er det vi hadde forventet. Riktig versjonsnummer vises i versjonsstrengen, og krypterings- og dekrypteringsrutinene fungerer.

Slette moduler fra et bibliotek

Det virker synd etter alt det, men la oss slette cipher_version.o-filen fra bibliotekfilen.

For å gjøre dette, bruker vi alternativet -d (slett). Vi bruker også alternativet -v (verbose), slik at ar forteller oss hva den har gjort. Vi vil også inkludere alternativet -s (indeks) for å oppdatere indeksen i bibliotekfilen.

ar -dsv libcipher.a cipher_version.o

ar rapporterer at den har fjernet modulen. «d» betyr «slettet.»

Hvis vi ber ar om å liste opp modulene inne i bibliotekfilen, vil vi se at vi er tilbake til to moduler.

ar -t libcipher.a

Hvis du skal slette moduler fra biblioteket ditt, husk å fjerne definisjonen fra bibliotekets overskriftsfil.

Del koden din

Biblioteker gjør koden delbar på en praktisk, men privat måte. Alle du gir bibliotekfilen og overskriftsfilen til kan bruke biblioteket ditt, men den faktiske kildekoden forblir privat.