Како користити Линук команду ар за креирање статичких библиотека

Користите Линук-ову команду ар да креирате библиотеке функција када развијате софтвер. Овај водич ће вам показати како да креирате статичку библиотеку, измените је и користите је у програму, заједно са примером кода.

Команда ар је прави ветеран — постоји од 1971. Име ар упућује на првобитну предвиђену употребу алата, која је била да креирате архивске датотеке. Архивска датотека је једна датотека која служи као контејнер за друге датотеке. Понекад за многе друге датотеке. Датотеке се могу додати, уклонити из архиве или издвојити из архиве. Људи који траже ту врсту функционалности више се не окрећу ар. Ту улогу су преузели други комунални програми као што је тар.

Ипак, команда ар се још увек користи за неколико специјалних сврха. ар се користи за креирање статичких библиотека. Они се користе у развоју софтвера. А ар се такође користи за креирање датотека пакета као што су „.деб“ датотеке које се користе у Дебиан Линук дистрибуцији и њеним дериватима као што је Убунту.

Проћи ћемо кроз кораке потребне за креирање и модификацију статичке библиотеке и демонстрирати како се користи библиотека у програму. Да бисмо то урадили, потребан нам је захтев да статичка библиотека испуни. Сврха ове библиотеке је да кодира низове текста и да декодира кодирани текст.

Имајте на уму да је ово брз и прљав хак у сврху демонстрације. Не користите ову енкрипцију за било шта што има вредност. То је најједноставнији на свету супституциона шифра, где А постаје Б, Б постаје Ц, и тако даље.

Функције ципхер_енцоде() и ципхер_децоде().

Радићемо у директоријуму који се зове „библиотека“, а касније ћемо креирати поддиректоријум под називом „тест“.

Имамо две датотеке у овом директоријуму. У текстуалној датотеци под називом ципхер_енцоде.ц имамо функцију ципхер_енцоде():

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

} // end of cipher_encode

Одговарајућа функција ципхер_децоде() налази се у текстуалној датотеци под називом ципхер_децоде.ц:

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

} // end of cipher_decode

Датотеке које садрже упутства за програмирање називају се датотеке изворног кода. Направићемо датотеку библиотеке под називом либципхер.а. Садржаће компајлиране верзије ове две датотеке изворног кода. Такође ћемо направити кратку текстуалну датотеку под називом либципхер.х. Ово је датотека заглавља која садржи дефиниције две функције у нашој новој библиотеци.

Свако ко има библиотеку и датотеку заглавља моћи ће да користи ове две функције у сопственим програмима. Не морају поново да измишљају точак и поново пишу функције; они једноставно користе копије у нашој библиотеци.

  7 најбољих ИДЕ за Линук за развој сложеног софтвера са лакоћом

Превођење датотека ципхер_енцоде.ц и ципхер_децоде.ц

За компајлирање датотека изворног кода користићемо гцц, тхе стандардни ГНУ компајлер. Опција -ц (компајлирање, без везе) говори гцц-у да компајлира датотеке и да затим заустави. Он производи посредничку датотеку из сваке датотеке изворног кода која се зове објектна датотека. Гцц линкер обично узима све објектне датотеке и повезује их заједно да би направио извршни програм. Прескачемо тај корак користећи опцију -ц. Требају нам само објектни фајлови.

Хајде да проверимо да ли имамо датотеке за које мислимо да имамо.

ls -l

Две датотеке изворног кода су присутне у овом директоријуму. Хајде да користимо гцц да их преведемо у објектне датотеке.

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

Не би требало да буде излаза из гцц-а ако све прође како треба.

Ово генерише две објектне датотеке са истим именом као датотеке изворног кода, али са екстензијама „.о“. Ово су датотеке које треба да додамо у датотеку библиотеке.

ls -l

Креирање библиотеке либципхер.а

Да бисмо креирали датотеку библиотеке — која је заправо архивска датотека — користићемо ар.

Користимо опцију -ц (креирај) за креирање датотеке библиотеке, опцију -р (додај са заменом) за додавање датотека у датотеку библиотеке и опцију -с (индекс) за креирање индекса датотека унутар фајл библиотеке.

Позваћемо датотеку библиотеке либципхер.а. Дајемо то име у командној линији, заједно са именима објектних датотека које ћемо додати у библиотеку.

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

Ако наведемо датотеке у директоријуму, видећемо да сада имамо датотеку либципхер.а.

лс -л

Ако користимо опцију -т (табела) са ар, можемо видети модуле унутар датотеке библиотеке.

ar -t libcipher.a

Креирање датотеке заглавља либципхер.х

Датотека либципхер.х ће бити укључена у било који програм који користи библиотеку либципхер.а. Датотека либципхер.х мора да садржи дефиницију функција које се налазе у библиотеци.

Да бисмо креирали датотеку заглавља, морамо укуцати дефиниције функција у уређивач текста као што је гедит. Датотеци дајте назив „либципхер.х“ и сачувајте је у истом директоријуму као и датотека либципхер.а.

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

Коришћење библиотеке либципхер

Једини сигуран начин да тестирамо нашу нову библиотеку је да напишемо мали програм који ће је користити. Прво ћемо направити директоријум који се зове тест.

mkdir test

Копираћемо библиотеку и датотеке заглавља у нови директоријум.

cp libcipher.* ./test

Пребацићемо се у нови директоријум.

cd test

Хајде да проверимо да ли су наша два фајла овде.

ls -l

Морамо да направимо мали програм који може да користи библиотеку и да докаже да функционише како се очекује. Откуцајте следеће редове текста у уређивач. Сачувајте садржај уређивача у датотеку под називом „тест.ц“ у директоријуму за тестирање.

#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

Ток програма је веома једноставан:

  Како рударити Битцоин Голд (БТГ) криптовалуту на Линук-у користећи Минергате

Укључује датотеку либципхер.х тако да може да види дефиниције функција библиотеке.
Он креира стринг под називом „текст“ и у њему складишти речи „Хов-То Геек ловес Линук“.
Штампа тај низ на екран.
позива функцију ципхер_енцоде() да кодира стринг и штампа кодирани стринг на екрану.
Позива ципхер_децоде() да декодира стринг и штампа декодирани низ на екрану.

Да бисмо генерисали програм за тестирање, потребно је да компајлирамо програм тест.ц и повежемо га у библиотеци. Опција -о (излаз) говори гцц-у како да позове извршни програм који генерише.

gcc test.c libcipher.a -o test

Ако вас гцц тихо врати у командну линију, све је у реду. Сада хајде да тестирамо наш програм. Тренутак истине:

./test

И видимо очекивани резултат. Програм за тестирање штампа обичан текст, штампа шифровани текст, а затим штампа дешифровани текст. Користи функције унутар наше нове библиотеке. Наша библиотека ради.

успех. Али зашто стати тамо?

Додавање другог модула у библиотеку

Хајде да додамо још једну функцију библиотеци. Додаћемо функцију коју програмер може да користи да прикаже верзију библиотеке коју користи. Мораћемо да креирамо нову функцију, компајлирамо је и додамо нову датотеку објекта у постојећу датотеку библиотеке.

Откуцајте следеће редове у уређивач. Сачувајте садржај уређивача у датотеку под називом ципхер_версион.ц, у директоријуму библиотеке.

#include 

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

} // end of cipher_version

Морамо да додамо дефиницију нове функције у датотеку заглавља либципхер.х. Додајте нови ред на дно те датотеке, тако да изгледа овако:

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

Сачувајте измењену датотеку либципхер.х.

Морамо да компајлирамо датотеку ципхер_версион.ц тако да имамо објектну датотеку ципхер_версион.о.

gcc -c cipher_version.c

Ово креира датотеку ципхер_версион.о. Нову објектну датотеку можемо додати у библиотеку либципхер.а са следећом командом. Опција -в (вербосе) чини да нам обично тихи ар каже шта је урадио.

ar -rsv libcipher.a cipher_version.o

Нова објектна датотека се додаје у датотеку библиотеке. ар исписује потврду. „а“ значи „додато“.

Можемо користити опцију -т (табела) да видимо који се модули налазе унутар датотеке библиотеке.

ar -t libcipher.a

Сада постоје три модула унутар наше библиотеке. Хајде да искористимо нову функцију.

Коришћење функције ципхер_версион().

Хајде да уклонимо стару библиотеку и датотеку заглавља из тест директоријума, копирамо у нове датотеке и вратимо се назад у тест директоријум.

Избрисаћемо старе верзије датотека.

rm ./test/libcipher.*

Копираћемо нове верзије у тест директоријум.

cp libcipher.* ./test

Променићемо се у тест директоријум.

cd test

И сада можемо да изменимо програм тест.ц тако да користи нову функцију библиотеке.

Морамо да додамо нови ред у програм тест.ц који позива функцију ципхер_версион(). Поставићемо ово пре првог стављања(текста); линија.

#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

Сачувајте ово као тест.ц. Сада га можемо компајлирати и тестирати да ли је нова функција оперативна.

gcc test.c libcipher.a -o test

Хајде да покренемо нову верзију теста:

  5 најбољих Гентоо Линук деривата за испробавање

Нова функција ради. Можемо видети верзију библиотеке на почетку излаза из теста.

Али можда постоји проблем.

Замена модула у библиотеци

Ово није прва верзија библиотеке; то је други. Наш број верзије је нетачан. Прва верзија није имала функцију ципхер_версион(). Овај ради. Дакле, ово би требало да буде верзија „0.0.2“. Морамо да заменимо функцију ципхер_версион() у библиотеци исправљеном.

Срећом, ар то чини веома лаким.

Прво, уредимо датотеку ципхер_версион.ц у директоријуму библиотеке. Промените текст „Верзија 0.0.1 Алпха“ у „Верзија 0.0.2 Алпха“. Требало би да изгледа овако:

#include 

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

} // end of cipher_version

Сачувајте ову датотеку. Морамо га поново компајлирати да бисмо креирали нову објектну датотеку ципхер_версион.о.

gcc -c cipher_version.c

Сада ћемо заменити постојећи објекат ципхер_версион.о у библиотеци са нашом ново компајлираном верзијом.

Раније смо користили опцију -р (додај са заменом) да бисмо додали нове модуле у библиотеку. Када га користимо са модулом који већ постоји у библиотеци, ар ће заменити стару верзију новом. Опција -с (индекс) ће ажурирати индекс библиотеке, а опција -в (вербосе) ће натерати ар да нам каже шта је урадио.

ar -rsv libcipher.a cipher_version.o

Овог пута ар извештава да је заменио модул ципхер_версион.о. „р“ значи замењено.

Коришћење функције Упдатед ципхер_версион().

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

Копираћемо датотеке библиотеке у директоријум за тестирање.

cp libcipher.* ./test

Променићемо се у тест директоријум.

cd ./test

Морамо поново да компајлирамо наш тестни програм са нашом новом библиотеком.

gcc test.c libcipher.a -o test

И сада можемо тестирати наш програм.

./test

Излаз из програма за тестирање је оно што смо очекивали. Тачан број верзије се приказује у стрингу верзије, а рутине шифровања и дешифровања функционишу.

Брисање модула из библиотеке

Чини се да је срамота након свега тога, али хајде да избришемо датотеку ципхер_версион.о из датотеке библиотеке.

Да бисмо то урадили, користићемо опцију -д (избриши). Такође ћемо користити опцију -в (вербосе), тако да нам ар говори шта је урадио. Такође ћемо укључити опцију -с (индекс) за ажурирање индекса у датотеци библиотеке.

ar -dsv libcipher.a cipher_version.o

ар извештава да је уклонио модул. „д“ значи „избрисан“.

Ако тражимо од ар да наведе модуле унутар датотеке библиотеке, видећемо да смо се вратили на два модула.

ar -t libcipher.a

Ако намеравате да избришете модуле из своје библиотеке, не заборавите да уклоните њихову дефиницију из датотеке заглавља библиотеке.

Поделите свој код

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