statiske biblioteker vs. dynamiske biblioteker

Erika Caoili

Følg

Dec 17, 2019 * 4 min læst

foto af Edvin Andrade på Unsplash

Hvad er et bibliotek i København?

Hvorfor bruger vi biblioteker?

hvordan oprettes et statisk og dynamisk bibliotek?

hvordan og hvorfor bruger vi dem?

et bibliotek i Linuk

et bibliotek er en samling af prækompilerede stykker kode kaldet funktioner. Biblioteket indeholder fælles funktioner og sammen danner de en pakke kaldet — et bibliotek. Funktioner er blokke af kode, der bliver genbrugt i hele programmet. Brug af stykker kode igen i et program sparer tid. Det forhindrer programmereren i at omskrive koden flere gange. For programmører leverer biblioteker genanvendelige funktioner, datastrukturer, klasser og så videre.

“for eksempel, hvis du bygger et program, der skal udføre matematiske operationer, behøver du ikke oprette en ny matematikfunktion til det, du kan blot bruge eksisterende funktioner i biblioteker til det programmeringssprog.”(“Forståelse af delte biblioteker”)

et bibliotek er ikke eksekverbart, og det er en vigtig forskel fra processer og applikationer. Biblioteker spiller deres rolle på kørselstid eller kompileringstid. I programmeringssproget C har vi to typer biblioteker: dynamiske biblioteker og statiske biblioteker.

biblioteker har objektfiler oprettet af "-c" gcc flag og slutter i ".o" efter konvention. De er resultatet af kompilatorens output og indeholder funktionsdefinitioner i binær form.

forskelle mellem dynamiske og statiske biblioteker

dynamiske biblioteker har en”*. så ” navngivningskonvention og statiske biblioteker har en “*.en”.

dynamiske eller delte biblioteker forekommer som separate filer uden for de eksekverbare filer. Således behøver den kun en kopi af bibliotekets filer ved kørsel. På kompileringstidspunktet forbliver statiske biblioteker låst i et program. Den indeholder filens programmer, der indeholder en kopi af bibliotekets filer på kompileringstidspunktet.

når du bruger et dynamisk bibliotek, refererer programmøren til det bibliotek, når det skal køres. For eksempel for at få adgang til strenglængdefunktionen fra standard input/output header file – kan du få adgang til den dynamisk. Det vil finde programmets bibliotek reference på runtime på grund af den dynamiske loader. Derefter indlæser den strenglængdefunktion i hukommelsen. Således skal den dynamiske bibliotekstilgængelighed være let tilgængelig, ellers bliver den magtesløs.

fordele og ulemper ved dynamiske biblioteker

  1. det behøver kun en kopi ved kørsel. Det afhænger af, at applikationen og biblioteket er tæt tilgængelige for hinanden.
  2. flere kørende applikationer bruger det samme bibliotek uden behov for, at hver fil har sin egen kopi.
  3. men hvad hvis det dynamiske bibliotek bliver ødelagt? Den eksekverbare fil fungerer muligvis ikke, fordi den lever uden for den eksekverbare og er sårbar over for brud.
  4. de holder mindre filer.
  5. dynamiske biblioteker er forbundet på run-time. Det kræver ikke genkompilering og relinking, når programmereren foretager en ændring.

på kompileringstidspunktet bruger applikationer statiske biblioteker. Alle kopier af funktionerne placeres i applikationsfilen, fordi de er nødvendige for at køre processen.

fordele og ulemper ved statiske biblioteker

  1. statiske biblioteker modstår sårbarhed, fordi den lever inde i den eksekverbare fil.
  2. hastigheden ved kørselstid sker hurtigere, fordi dens objektkode (binær) er i den eksekverbare fil. Således bliver opkald til funktionerne udført hurtigere. Husk, at det dynamiske bibliotek bor uden for den eksekverbare, så opkald vil blive foretaget udefra af den eksekverbare.
  3. ændringer i filerne og programmet kræver relinking og genkompilering.
  4. Filstørrelsen er meget større.

hvordan skaber man et statisk og dynamisk bibliotek?

for begge biblioteker skal dit program indeholde en prototype for hver af de funktioner, der findes i dit bibliotek. Hvis du bruger en headerfil, skal du ikke glemme at medtage header filename.

#include "<header file name>"

dynamiske biblioteker

for at oprette et dynamisk bibliotek skal du skrive følgende kommando:

gcc -g -fPIC -Wall -Werror -Wextra -pedantic *.c -shared -o liball.so

med "*.c" — det tager alle C-kildefilerne i den aktuelle mappe og gør et delt bibliotek kaldet "liball.so." -fPIC flag gør det muligt at henvise til følgende kode på enhver virtuel adresse ved kørsel. Det står for Position Independent Code.Biblioteket indeholder ikke data på faste adresser, fordi dets placering i hukommelsen ændres mellem programmer. Objektfiler bliver kompileret ved hjælp af -shared flag. compiler vil senere identificere et bibliotek ved at søge efter filer, der begynder med "lib" og slutter med navngivningskonventionen, .so

programmet har brug for stien for at lede efter bibliotekets filer. Så du skal skrive følgende kommando for at tilføje denne placering til den kaldte miljøvariabelLD_LIBRARY_PATH.

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

når du bruger det dynamiske bibliotek, skal du skrive følgende kommando:

gcc -g -wall -o app app.c liball.so

statiske biblioteker

for at oprette et statisk bibliotek skal vi bruge følgende kommando:

ar rc liball.a dog.o cat.o bird.o

"ar" står for archive og bruges til at oprette det statiske bibliotek. Alle filer, der slutter på ".o", føjes til liball.a library, og de er objektfilerne i dette tilfælde.

-rc flag gør to ting: Udskift og opret et nyt bibliotek, hvis det ikke allerede findes. Det næste trin er indeksering, for at gøre det, skriver vi:

ranlib liball.a

når du bruger det statiske bibliotek, skal du skrive følgende kommando:

gcc main.c -L -l<filename>

-L flag får adgang til linker, så bibliotekerne kan findes i den givne mappe. Det søger også efter andre steder, hvor kompilatoren søger efter systembiblioteker.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.