Оқулық «Федералдық білім беруді дамыту институты»


UNIX  БАҒДАРЛАМАЛАРДЫ КОМПИЛЯЦИЯЛАУ



Pdf көрінісі
бет162/220
Дата25.02.2022
өлшемі2,22 Mb.
#26438
түріОқулық
1   ...   158   159   160   161   162   163   164   165   ...   220
 
UNIX  БАҒДАРЛАМАЛАРДЫ КОМПИЛЯЦИЯЛАУ 
UNIX-та  бағдарламаларды  компиляциялау  екі  кезеңде  жүргізіледі.  
Шығыс 
мәтіндерінің 
бірінші 
кезеңінде 
cc 
(немесе 
gcc) 
компиляторының  көмегімен  объективті  файлдар  (.o  кеңейтілуімен) 
қалыптасады. Екінші кезеңде ld жинаушының көмегімен орындалатын 
файл немесе кітапхана файлы қалыптасады. 
 
Жинау  мен  компиляция  процесін  басқару  (мысалы,  кодты 
оңтайландыру  деңгейі,  шығу  файлының  параметрі,  жүйелік 
кітапханаларға  жолдар)  жинаушы  мен  компиляторды  іске  қосу 
кілттерімен беріледі.  
Қарапайым  бағдарламаларды  жинау  және  компиляциялау  үшін 
бұдан  әрі  автоматты  түрде  ld    жинаушысын  қосатын,  gcc 
компиляторын шақыру жеткілікті. 
 
Мысалы,  myprogram.c  файлынан  шығыс  мәтіндік  бағдарламалар 
негізінде  myprogram орындалушы файлын алу үшін   
 


 
170 
 
gcc -o myprogram myprogram.c 
командасын орындау 
жеткілікті.


171 
 
 
Мұнда 
о
  кілтінен  кейін  шығатын  орындалушы  файлдың  атауы 
көрсетіледі.  Кілттерден  кейін  құрастырушы  файлдың  атауы 
көрсетіледі.  Ақпараттар  типтері  мен  функциялардың  анықтамасын 
құрайтын бірнеше файлдарды көрсету мүмкіндігі:
 
gcc -o myprogram myprograml.c myprogram2.c
 
Шығыстық  мәтіндер  файлдарын  құрастыру  кезінде  функциялар, 
жобалау  ауыспалылар  немесе  бір  атты  атаулармен  ақпарат  түрлерінің 
анықтамалары  қатыспауы  керек,  мысалы  main()  функциясын  бірнеше 
рет жариялау қолжетімсіз.  
 
Тақырыптық  файлдар  мен  кітапханалар  файлдары  орналасқан 
жолдарды көрсету үшін сәйкесінше -I және –L  кілттері қолданылады. 
Мысалы,  келесі  параметрді  құрастыру  кезінде,  компилятор 
/usr/local/indude  каталогындағы  тақырыптық  файлдарды,  /usr/local/lib 
және /usr/share/lib: каталогында – кітапханаларды іздейтін болады. 
 
gcc -o myprogram -I/usr/local/include\ -L/usr/local/lib 
-L/usr/share/lib myprogram.c
 
Статикалық  кітапханалардың  файлдары  кеңейтулерге  ие,  ал 
олардың  атаулары    lib  сөзден  басталады.  Мысалы,  libm.a  — 
кітапхананың  аты,  math.h.  Тақырыптық  файлдарында  анықталған, 
математикалық бағдарламалық кодтан тұрады.  
 
Орындалатын файлдың жинау процесі кезінде кітапханаларды қосу 
үшін  -l  кілті  қолданылады.  Қосылатын  кітапханалардың  атауы  lib 
префиксіз  және  .a  кеңейтуінсіз  көрсетіледі.    Мысалы,  libm.a 
кітапханаларды  пайдаланушы  бағдарламаларды  құрастыру  және 
компиляциялау үшін 
 
gcc -o myprogram -L/usr/lib -lm myprogram.c  
шақыртуларды қолдану қажет.
 
Мұнда  L-кілті  кітапханалардың  орналасуын  береді,  ал  -l  —  оның 
атауы.
 
Статикалықтан  басқа,  UNIX-жүйелерінің  көпшілігі  тиелетін 
динамикалық  кітапханаларды  көтереді.    Мұндай  кітапханаларда 
сақталатын  функцияның  бағдарламалық  кодтары,  бағдарламаларды 
орындау  уақытында  динамикалық  тиеледі.  Динамикалық  тиелетін 
кітапханалардың  файлдары  .so  кеңейтулеріне  ие  болады,  файлдардың 
атауы  lib  префиксімен  басталады.  Сонымен,  математикалық 
функциялар  кітапханаларының  динамикалық  тиелетін  нұсқалары 
libm.so атауына ие болады.
 
Орындалатын файлдарды құрастыру кезінде динамикалық тиелетін 
кітапханалардан  функциясын  шақырту  нүктелерін  орнату  үшін  -


 
172 
 
dynamic  компиляторының  кілтін  көрсету  қажет.  Келесі  команда, 
бағдарламаның шығысты мәтінді c.myprogram файлында, орындалатын 
файл  myprogram  құрастыру  және  компиляциялауды  орындайды. 
Сонымен  қатар,  математикалық  кітапхананың  динамикалық  нұсқасы 
қолданылады,  ал  кітапханалық  файлдарды  іздеу  мына  каталогтан 
жүреді: /usr/local/lib:
 
gcc -dynamic -o myprogram -L/usr/local/lib\ myprogram.c
 
Динамикалық  кітапханаларды  қолдану  статикалықтарға  қарағанда 
артықшылықтары бар — кітапханалық функциялардың бағдарламалық 
коды  орындалушы  файлдан  тыс  орналасады  және  бірнеше 
бағдарламалармен  бірге  қолданылады.  Статикалық  кітапханаларды 
қолдану  кезінде,  бағдарламалық  код  орындалатын  файлда  сақталатын 
болғандықтан,  динамикалық  кітапханалардың  артығынан  құтылу 
есебінен,  дискілік  кеңістікті  үнемдеуге  мүмкіндік  береді.  Дегенмен 
динамикалық  кітапханалардың  артықшылықтарының  кері  жақтары  да 
бар. 
Динамикалық 
кітапханалар, 
олардың 
бағдарламаларын 
пайдаланушылардан бөлек, жүйеге қондырылады, қажетті кітапханалар 
болмаған жағдайда немесе динамикалық кітапханаларды пайдаланушы 
бағдарламалардың  кітапханалар  сәйкес  келмеуі  кезінде  жұмысқа 
жарамсыз болып қалуы мүмкін.   
 
UNIX-жүйелерінің 
көбісінде 
бағдарламалардың 
жұмысқа 
қабілетсіздігін    ldd  командасы  анықтайды.  Орындалатын  файлдың 
атауымен осы бағдарламаның іске қосылуынан кейін, экран бетіне бұл 
файлмен орындалатын динамикалық кітапханалардың тізімі, кітапхана 
файлдарына  жол  және  кітапханалардың  болмауы  жөнінде  ақпарат  
шығады:  
 
$ ldd 'which scat' libnsl.so.1 => No library 
found libncurses.so.4 => 
/usr/lib/libncurses.so.4 (0x40035000)
 
libc.so.6 => /lib/libc.so.6 (0x40077000) 
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 
(0x40000000)
 
Кітапханалардың болмауы туралы ақпарат – оның орнатуға тікелей 
көрсетеді.    Кітапханалардың  шиеленісуі  жанамалы  түрде  атауы 
бойынша  және  кітапханалар  файлына  жолы  бойынша  анықталады. 
Мысалы,  бағдарлама  кітапхананы  басқа  каталогта  іздеп,  қателесуі 
мүмкін.  Бұл  жағдайда  міндетті  түрде  кітапхананы  қажетті  каталогқа 
орнын  ауыстыруы  керек  немесе  LD_LIBRARY_PATH  ауыспалы 
шеңберінде  кітапханаларды  каталог  бойынша  сатылы  іздеуді  орнату 
керек. Бұл ауыспалыдағы каталог тізімінің параметрі, PATH ауыспалы 
тізімінің параметріне ұқсайды. 
 


173 
 
 
Ауыспалы  шеңберлер  командалық  жолдың  компиляторымен 
жұмысын жеңілдету үшін де қолданылуы мүмкін. Осылайша, әр түрлі 
каталогтарда  (мысалы,  кейінге  қалған  ақпаратты  құрайтын  немесе 
құрамайтын  кітапханалар)  орналасқан  бірдей  атаулы  кітапханалардың 
жинағын пайдаланумен, бағдарламалардың компиляциялау қажеттілігі 
туындаса  онда  кітапханаларға  жолды  ауыспалы  шеңберге  (мысалы, 
MY_LIB) ауыстыруға болады және ағымдағы қажеттілікке байланысты 
шеңберлердің  ауыспалыларының  мәндерін  ауыстыруға  болады. 
Компиляторды шақыру осылай көрініс табады: 
 
gcc -dynamic -o myprogram -L${MY_LIB} myprogram.c
 
Жоғарыда  қарастырылған  барлық  бағдарлама  құрастыру  және 
компиляциялау  тәсілдері  пайдаланушыдан  құрастыру  кезеңдерін 
жасырады  —  обьективті  файлдар  орындалатын  файлдың  пайда 
болуынан  кейін  бірден  өшіріледі  және  пайдаланушы  обьективті 
файлды көрместен, орындалатын файлды қабылдап отырды. 
 
Кейбір  жағдайларда  екі  кезең—  обьективті  файлдарды  сақтай 
отырып,  құрастыру  мен  құрастырмалау  орындалады.  Мысалы,  кейбір 
кітапханалар шығыстық мәтінсіз объективті файл түрінде ұсынылады. 
Мұндай  кітапханаларды  пайдаланушы  бағдарламаларды  құрастыру 
үшін  алдымен  өз  бағдарламасының  объективті  файлын  алу  қажет, 
содан кейін барлық  (өзінің  және  кітапханалық)  объективті  файлдарды 
орындалатын файлға жинау керек. 
 
Объективті файлды алу үшін компилятордың -c кілті қолданылады. 
Осылайша, команда
 
gcc -c myfilel.c myfile2.c -I/usr/local/include
 
файлдар    компиляциясын  myfile1.c  и  myfile2.c    шақырады  және 
олардың  нәтижелері  myfile1.o  и  myfile2.o  обьективті  файлдарында 
сақталады.    Компиляцияға  қажетті  тақырыптық  файлдарды  іздеу  -  
/usr/local/include каталогында жүреді.
 
Обьективтіге  жиналған  орындалатын  файлдарды  алу  үшін  оған 
обьективті файлдарды параметр ретінде жіберу арқылы, компиляторды 
шақыру  жеткілікті.  Компилятор  файлдар  бағдарламаның  шығыстық 
мәтіні  еместігін  таниды,  және  оны  құрастырушыға  өңдеуге  жібереді. 
Осылайша, команда
 
gcc -shared -o myprogram -L/usr/local/lib -lm myfilel.o 
myfile2.o
 
myfile  1  .o  и  myfile2.o.  обьективті  файлдарының  ішінен    myprogram 
бағдарламасының  жинағын  шақырады.  Сонымен  қатар  орындалатын 
файлда  libm.so  динамикалық  кітапханалық  функцияларының  шақыру 


 
174 
 
нүктелерін қояды, құрастыру кезеңінде іздеу  /usr/local/lib каталогында 
жүреді  (бағдарламаның  орындалуы  кезінде  кітапхананың  орналасуы 
LD_LIBRARY_PATH ауыспалы шеңберінде берілетін болады).
 
BASH  тілінде  беру  қиын  болатын,  қарапайым  бағдарламаға  мысал 
келтіреміз.  Бұл  бағдарлама,  100-ге  көбейтілген  берілген  параметрі 
ретінде бұрыштың синус мәніне тең толық санды қайтарады. BASH –та 
тригонометриялық  функциялар  құрмаған,  бірақ  С-  да  бұл  бағдарлама 
салыстырмалы түрде қарапайым жүреді: 
 
#include 
 
#include 
 
int main(int argc, char **argv)
 
{
 
double res; int angle;
 
if (argc <= 1) return 0;
 
atoi(argv[1],  angle); 
res  =  sin(angle)*100; 
return (int)res;
 
}
 
Бұл  бағдарламаны  құрастыру  үшін  келесі  шақыртулар  жолын  gcc 
пайдалануға болады: 
 
gcc -lm -o sin -L/usr/lib -I/usr/include sin.c
 
мұндай 
бағдарламаны 
пайдаланатын 
міндеттер, 
мынадай 
бейнеленеді: 
 
#!/bin/bash
 
if [ -z $1 ]; then
 
echo "No parameters specified"
 
exit 1
 
fi
 
if [ ! -z $2 ] ; then
 
echo "More than one parameter specified" exit 2 fi ./sin 
$1
 
echo "Hundredths of sine of angle $1 equals " $?
 
 


175 
 
 
120  параметрімен  іске  асырылған,  мұндай  тапсырмаларды  экранға 
шығару осылай көрінеді:  
 
Hundredths of sine of angle 120 equals 86
 


Достарыңызбен бөлісу:
1   ...   158   159   160   161   162   163   164   165   ...   220




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет