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


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



Pdf көрінісі
бет112/158
Дата01.07.2023
өлшемі3.83 Mb.
#475485
түріОқулық
1   ...   108   109   110   111   112   113   114   115   ...   158
операциялық жуйелер

 
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   ...   108   109   110   111   112   113   114   115   ...   158




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

    Басты бет