Какви са разликите между статичните и динамичните библиотеки?

„C библиотека“ е набор / група от именани функции, например free (), malloc () или printf (). Изложени за използване от други програми.

Тези функции или променливи са разделени на свързани групи, наречени заглавен файл. И „библиотека“ е колекция от тези заглавни файлове.

Защо да използвате библиотеки?

Файловете на библиотеките и заглавките са направени за улесняване на достъпа. Да вземем пример, за да разберем това.

В нашия твърд диск създаваме много папки. Съхраняваме един и същ тип свързани данни в една папка. Всяка папка съдържа един и същ тип данни. Ако съхраняваме всички видове данни само в една папка, ще бъде трудно да получите достъп до тях. За да улесним достъпа ни, групираме свързани данни в една папка.

Същата е политиката на заглавните файлове. Всички свързани променливи и функции са групирани в него, също като същия тип данни в папка. И тези заглавни файлове се поставят колективно в библиотека.

Видове функции

Видове функции

Преди всичко да прегледаме класификацията на функция; Функциите могат да бъдат класифицирани в две категории

  • Функции на библиотеката или стандартни функции.
  • Дефинирана от потребителя функция.
Функциите на библиотеката са предварително определената функция в компилатор и някои от техните примери са printf () и scanf (). В C Програмиране, заглавните файлове на потребителя поставете в началото на програмата, за да използвате съответната функция на библиотеката. Като цяло, всички подобни видове библиотечни функции са групирани под един заглавен файл, означава да се каже, че библиотечни функции като pow (), sin () и т.н. всички се използват за извършване на математическата операция, дефинирана само в math.h заглавен файл. Дефинираната от потребителя функция се записва от потребителя в момента на писане на програмата. Всички библиотека и дефинирани от потребителя функции могат да бъдат извиквани от функция main ().

Източник: https://electricalworkbook.com/c-functions/

Как работят?

Функциите на библиотеката са C функции, компилирани и предоставени заедно с други обекти, които са групирани заедно и поставени на общо място, наречено библиотека.

Всяка библиотечна функция в C изпълнява специфична операция. Можем да използваме тези библиотечни функции, за да получим предварително дефинирания изход, вместо да пишем собствен код, за да получим тези изходи.

Какви са разликите между статичните и динамичните библиотеки?

Библиотеките се предлагат в два вкуса: статичен и динамичен.

Динамичните библиотеки не се нуждаят от копиране на кода, а само чрез поставяне на името на библиотеката в двоичния файл. Действителното свързване се случва, когато програмата се стартира, когато и двоичният файл, и библиотеката са в паметта. Примери на динамични библиотеки (библиотеки, които са свързани по време на изпълнение) са, .so в Linux и .dll в Windows.

За разлика от динамичните, статичните библиотеки включват код на обектния файл от библиотеката в двоичния код на целта. Това води до по-голям размер на диска и по-бавни времена на стартиране. Тъй като кодът на библиотеката се добавя директно към двоичния код на свързаната цел, това означава, че за да се актуализира всеки код в библиотеката, свързаната цел също трябва да бъде възстановена.

Как да ги създадете?

-Създайте статична библиотека:

1- Създайте C файл с основна функция:

/ * име на файл: driver.c * /
#include „lib_mylib.h“
невалиден основен ()
{
забавление ();
}

2- Компилирайте програмата за драйвери:

gcc -c driver.c -o driver.o

3. Свържете компилираната програма за драйвери със статичната библиотека. Обърнете внимание, че -L. се използва, за да каже, че статичната библиотека е в текущата папка (Вижте това за подробности за опциите -L и -l):

gcc -o драйвер на водача.o -L. -l_mylib

4. Стартирайте програмата за драйвери:

./driver
fun (), извикан от статична библиотека

това е всичко.

-Създайте динамична библиотека.

В двуетапен процес.

  1. Създайте обект код
  2. Създайте библиотека

позволява компилиране на целия ни изходен код за възражение.

gcc -Wall -fPIC -c * .c

нека да видим какво значение има тази опция, наречена „-fPIC“:

-fPIC
Ако се поддържа за целевата машина, излъчвайте независим от позицията код, подходящ за динамично свързване и избягване на ограничения върху размера на глобалната таблица на компенсиране. Тази опция прави разлика в AArch64, m68k, PowerPC и SPARC.
Независимият от позицията код изисква специална поддръжка и затова работи само на определени машини.
Когато този флаг е зададен, макросите __pic__ и __PIC__ са определени на 2.

Източник: https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#Code-Gen-Options

С други думи означава, че генерираният машинен код не зависи от това да бъде разположен на конкретен адрес, за да работи.

Сега трябва всъщност да превърнем този обект файл в споделена библиотека.

gcc -shared -o libexample.so * .o

Тук ще отнеме всички обектни файлове и ще се вмъкне в библиотеката.

Там можете да намерите между вашите файлове .so файла, това е нашата споделена или динамична библиотека.

Как да ги използвате?

Първо, когато намерите някаква необходима функция, която трябва да бъде внедрена във вашия код, трябва да я извикате, в първата част на кода.

#include <”Име на библиотеката”>

Затова трябва да използвате #include, за да включите заглавните файлове на библиотеките, които искате да се обадите или използвате във вашия код.

След това, когато компилирате кода си, той ще знае къде точно е тази функция, която декларирате, че трябва да бъде извикана.

Какви са предимствата и недостатъците на всеки от тях?

За статична библиотека:

1. В статични библиотеки, след като всичко е свързано във вашето приложение, не е нужно да се притеснявате, че клиентът ще разполага с подходящата библиотека (и версия) на разположение в системата си.

2. Едно от основните предимства на статичните библиотеки, които се предпочитат дори и сега, е „скоростта“. Няма да има динамично запитване на символи в статични библиотеки. Много софтуер за производствена линия използват статични библиотеки и до днес.

3. Един недостатък на статичните библиотеки е, за всяка промяна в статичните библиотеки, трябва да прекомпилирате основната програма всеки път.

За динамична библиотека:

  1. Можете да намалите размера на програмите си, като използвате динамично свързване. Идеята зад споделените библиотеки е да има само едно копие от често използвани процедури и да се поддържа това общо копие в уникален сегмент от библиотека с споделяни. Тези общи процедури могат значително да намалят размера на изпълними програми, като по този начин спестяват дисково пространство.
  2. Времето за зареждане може да бъде намалено, тъй като общият код на библиотеката може би вече е в паметта.
  3. Минуси: Динамично свързаните програми зависят от наличието на съвместима библиотека. Ако библиотеката е променена (например, ново издание на компилатор може да промени библиотека), може да се наложи приложенията да бъдат преработени, за да станат съвместими с новата версия на библиотеката. Ако библиотека бъде премахната от системата, програмите, използващи тази библиотека, вече няма да работят.