Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для Linux. ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 3

Автор ΠœΠ°Ρ€ΠΊ ΠœΠΈΡ‚Ρ‡Π΅Π»Π»

int main() {

printf("Hello, world\n");

}

НаТатиС клавиши <Tab> Π² строкС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf() ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ:

int main() {

  printf("Hello, world\n");

}

По ΠΌΠ΅Ρ€Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ Emacs Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ срСдства форматирования. ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ. Ρ‡Ρ‚ΠΎ ΠΎΠ½ позволяСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ практичСски Π»ΡŽΠ±Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, связанныС с автоматичСским Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Благодаря этому Π±Ρ‹Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ€Π΅ΠΆΠΈΠΌΡ‹ рСдактирования мноТСства Π²ΠΈΠ΄ΠΎΠ² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ ΠΈΠ³Ρ€Ρ‹[3] ΠΈ Π΄Π°ΠΆΠ΅ Π‘Π£Π‘Π”.

1.1.3. БинтаксичСскиС выдСлСния

Помимо форматирования ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Emacs ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ², написанных Π½Π° C/C++, выдСляя Ρ†Π²Π΅Ρ‚ΠΎΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ синтаксичСскиС элСмСнты. НапримСр, ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹ ΠΎΠ΄Π½ΠΈΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ, названия встроСнных Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… β€” Π΄Ρ€ΡƒΠ³ΠΈΠΌ, Π° ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ β€” Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΠΌ. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡˆΠΈΡ€ΠΎΠΊΠΎ распространСнных синтаксичСских ошибок.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Ρ… Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΉ, ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» ~/.emacs ΠΈ Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π² Π½Π΅Π³ΠΎ Ρ‚Π°ΠΊΡƒΡŽ строку:

(global-font-lock-mode t)

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ», Π²Ρ‹ΠΉΠ΄ΠΈΡ‚Π΅ ΠΈΠ· Emacs ΠΈ пСрСзапуститС Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ исходный Ρ„Π°ΠΉΠ» ΠΈ Π½Π°ΡΠ»Π°ΠΆΠ΄Π°Ρ‚ΡŒΡΡ!

Π’Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ»ΠΈ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ строка, вставлСнная Π² Ρ„Π°ΠΉΠ» .emacs, выглядит написанной Π½Π° языкС LISP. Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ LISP! Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° Emacs Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° этом языкС. На Π½Π΅ΠΌ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΊ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Ρƒ.

1.2. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Ρ‹ GCC

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ исходный тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, понятный Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΡƒ, Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. исполняСмый ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Ρ‹, доступныС Π² Linux-систСмах, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π΅ΡΡ‚ΡŒΡŽ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ GNU-компиляторов, извСстной ΠΊΠ°ΠΊ GCC (GNU Compiler Collection).[4] Π’ Π½Π΅Π΅ входят компиляторы языков Π‘, C++, Java, Objective-C, Fortran ΠΈ Chill. Π’ этой ΠΊΠ½ΠΈΠ³Π΅ нас Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ лишь ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π°.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, имССтся ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ входят Π΄Π²Π° исходных Ρ„Π°ΠΉΠ»Π°: ΠΎΠ΄ΠΈΠ½ написан Π½Π° Π‘ (main.c; листинг 1.1), Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” Π½Π° C++ (reciprocal.cpp; листинг 1.2). ПослС компиляции ΠΎΠ±Π° Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΡƒΡŽΡ‚ΡΡ вмСстС, образуя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ reciprocal,[5] которая вычисляСт ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа.

Листинг 1.1. (main.c) Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π½Π° языкС Π‘

#include <stdio.h>

#include "reciprocal.hpp"


int main(int argc, char **argv) {

 int i;

 i = atoi(argv[1]);

 printf("The reciprocal of %d is %g\n", i, reciprocal(i));

 return 0;

}

Листинг 1.2. (reciprocal.cpp) Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π½Π° языкС C++

#include <cassert>

#include "reciprocal.hpp"


double reciprocal (int i) {

 // АргумСнт Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ

 assert(i != 0);

 return 1.0/i;

}

Π•ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Ρ„Π°ΠΉΠ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ называСтся reciprocal.hpp (листинг 1.3).

Листинг 1.3. (reciprocal.hpp) Π€Π°ΠΉΠ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ²

#ifdef __cplusplus

extern "Π‘" {

#endif


extern double reciprocal(int i);


#ifdef __cplusplus

}

#endif

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ шаг Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ исходных Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄.

1.2.1. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ исходного Ρ„Π°ΠΉΠ»Π°

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ языка Π‘ называСтся gcc. ΠŸΡ€ΠΈ компиляции исходного Ρ„Π°ΠΉΠ»Π° Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ -с. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки компилируСтся Ρ„Π°ΠΉΠ» main.с:

% gcc -с main.с

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ main.o.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ языка C++ называСтся g++. Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ gcc. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для компиляции Ρ„Π°ΠΉΠ»Π° reciprocal.cpp:

% g++ -c reciprocal.cpp

ΠžΠΏΡ†ΠΈΡ -с Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ компилятору ΠΎ нСобходимости ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» (ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ reciprocal.o). Π‘Π΅Π· Π½Π΅Ρ‘ компилятор g++ попытаСтся ΡΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ исполняСмый Ρ„Π°ΠΉΠ».

Π’ процСссС написания любой Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ задСйствуСтся ряд Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, опция -I сообщаСт компилятору ΠΎ Ρ‚ΠΎΠΌ, Π³Π΄Π΅ ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ². По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ компиляторы GCC ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, Π³Π΄Π΅ установлСны Ρ„Π°ΠΉΠ»Ρ‹ стандартных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, наш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ состоит ΠΈΠ· Π΄Π²ΡƒΡ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²: src ΠΈ include. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° даст компилятору g++ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» reciprocal.hpp Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ../include :

% g++ -с -I ../include reciprocal.cpp

Иногда трСбуСтся Π·Π°Π΄Π°Ρ‚ΡŒ макроконстанты Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС. НапримСр, Π² коммСрчСской вСрсии ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅Ρ‚ нСобходимости ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ утвСрТдСния Π² Ρ„Π°ΠΉΠ»Π΅ reciprocal.cpp; ΠΎΠ½Π° Π½ΡƒΠΆΠ½Π° лишь Π² цСлях ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΡƒΡ‚Π΅ΠΌ опрСдСлСния макроконстанты NDEBUG. МоТно, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, явно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Ρ„Π°ΠΉΠ» Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #define, Π½ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ исходного тСкста ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΡ€ΠΎΡ‰Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС:

% g++ -c -D NDEBUG reciprocal.cpp

Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ:

% g++ -с -D NDEBUG=3 reciprocal.cpp

ΠŸΡ€ΠΈ написании коммСрчСских ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ срСдства ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ Π² компиляторах GCC. Π•ΡΡ‚ΡŒ нСсколько ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ; для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ» reciprocal.cpp с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ уровня:

% g++ -с -O2 reciprocal.cpp

Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ срСдства ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΡƒΡΠ»ΠΎΠΆΠ½ΡΡŽΡ‚ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π±Ρ‹Π²Π°ΡŽΡ‚ случаи, ΠΊΠΎΠ³Π΄Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΡ€ΠΎΡΠ²Π»Π΅Π½ΠΈΡŽ скрытых ошибок, Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹Ρ… Ρ€Π°Π½Π΅Π΅.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Ρ‹ gcc ΠΈ g++ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ мноТСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… ΠΏΠΎΠ»Π½Ρ‹ΠΉ список ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. Для этого Π²Π²Π΅Π΄ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

% info gcc

1.2.2. Компоновка ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ»Ρ‹ main.c ΠΈ reciprocal.cpp скомпилированы, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…. Если Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» C++, ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° всСгда осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ компилятора g++. Если ΠΆΠ΅ всС Ρ„Π°ΠΉΠ»Ρ‹ написаны Π½Π° языкС Π‘, Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ компилятор gcc. Π’ нашСм случаС ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΠ±ΠΎΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ², поэтому трСбуСмая ΠΊΠΎΠΌΠ°Π½Π΄Π° выглядит Ρ‚Π°ΠΊ:

% g++ -ΠΎ reciprocal main.o reciprocal.o

ΠžΠΏΡ†ΠΈΡ -ΠΎ Π·Π°Π΄Π°Π΅Ρ‚ имя Ρ„Π°ΠΉΠ»Π°, создаваСмого Π² процСссС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ reciprocal:

% ./reciprocal 7

The reciprocal of 7 is 0.142857

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, компилятор g++ автоматичСски ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ» ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ языка Π‘, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf(). Для ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, модуля Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ графичСского интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ) Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ -l. Π’ Linux ΠΈΠΌΠ΅Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с прСфикса lib. НапримСр, Ρ„Π°ΠΉΠ» ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ модуля Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ (Pluggable Authentication Module, РАМ) называСтся libpam.a. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ с ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈΡΡ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, Π²Π²Π΅Π΄ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

% g++ -ΠΎ reciprocal main.o reciprocal.o -lpam

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ автоматичСски Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ ΠΊ ΠΈΠΌΠ΅Π½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ прСфикс lib ΠΈ суффикс .a.

Как ΠΈ Π² случаС с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ², компилятор ΠΈΡ‰Π΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² стандартных ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…, Π² частности /lib ΠΈ /usr/lib. Для задания Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° опция -L, которая Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π²ΡˆΠ΅ΠΉΡΡ Π²Ρ‹ΡˆΠ΅ ΠΎΠΏΡ†ΠΈΠΈ -I. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° сообщаСт ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ поиск Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π½ΡƒΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ /usr/local/lib/pam:

% g++ -o reciprocal main.o reciprocal.o -L/usr/local/lib/pam -lpam

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ прСпроцСссора, автоматичСски Π²Π΅Π΄ΡƒΡ‰Π΅Π³ΠΎ поиск Ρ„Π°ΠΉΠ»ΠΎΠ² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ просматриваСт лишь стандартныС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» находится Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, ΠΎΠ± этом Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ явно с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΈ -L. НапримСр, послС выполнСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ test:

% gcc -o app app.o -L. -ltest

1.3. Автоматизация процСсса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GNU-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ make

Π’Π΅, ΠΊΡ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΡŽΡ‚ Π² Windows, ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ срСдС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚ добавляСт Π² Π½Π΅Π΅ исходныС Ρ„Π°ΠΉΠ»Ρ‹, Π° срСда автоматичСски создаСт ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. АналогичныС срСды доступны ΠΈ Π² Linux, Π½ΠΎ ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ…. ВмСсто этого ΠΌΡ‹ Π½Π°ΡƒΡ‡ΠΈΠΌ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с GNU-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ make, Π·Π½Π°ΠΊΠΎΠΌΠΎΠΉ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Ρƒ Linux-программистов. Она позволяСт автоматичСски ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

Основная идСя ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ make проста. Π•ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ†Π΅Π»Π΅Π²Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² процСссС построСния исполняСмого Ρ„Π°ΠΉΠ»Π°, ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°Π΅Ρ‚ этот процСсс. Π’Π°ΠΊΠΆΠ΅ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ зависимости, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ пСрСстроСн.