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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 168

Автор ΠœΡΡ‚ΡŒΡŽ НСйл

.cpp.o:

 $ (CC) -xc++ $(CFLAGS) -I$(INCLUDE) -с $<

Особая Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ

.cpp.o:
ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ
make
ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для трансляции Ρ„Π°ΠΉΠ»Π° с суффиксом .cpp Π² Ρ„Π°ΠΉΠ»Ρ‹ с суффиксом .ΠΎ. ΠŸΡ€ΠΈ написании этой зависимости ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… макросов, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нСизвСстны Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½ΡƒΠΆΠ½ΠΎ просто Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ символы
$<
Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„Π°ΠΉΠ»Π° (со старым суффиксом). Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ сообщили
make
Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° с суффиксом .cpp Ρ„Π°ΠΉΠ» с суффиксом .ΠΎ; ΠΊΠ°ΠΊ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ», ΠΊΠΎΠΌΠ°Π½Π΄Π°
make
ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚.

ПослС запуска ΠΊΠΎΠΌΠ°Π½Π΄Π°

make
примСняСт вашС Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ для получСния ΠΈΠ· Ρ„Π°ΠΉΠ»Π° bar.cpp Ρ„Π°ΠΉΠ»Π° bar.o; Π΄Π°Π»Π΅Π΅ ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свои встроСнныС ΠΏΡ€Π°Π²ΠΈΠ»Π° для прСвращСния Ρ„Π°ΠΉΠ»Π° с суффиксом .ΠΎ Π² исполняСмый Ρ„Π°ΠΉΠ». Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π»Π°Π³
-xc++
Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅
gcc
ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»ΠΎ с исходным Ρ„Π°ΠΉΠ»ΠΎΠΌ Π½Π° языкС C++.

Π’ наши Π΄Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°

make
Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с исходными Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π½Π° Π‘++ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ cpp, Π½ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΠ»Π΅Π·Π΅Π½ для прСобразования Ρ„Π°ΠΉΠ»Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² Ρ„Π°ΠΉΠ» Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

Π‘Π°ΠΌΡ‹Π΅ послСдниС вСрсии ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ make Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ запись для достиТСния Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ эффСкта ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. НапримСр, ΠΏΡ€Π°Π²ΠΈΠ»Π° с шаблонами ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π·Π½Π°ΠΊ подстановки

%
для сопоставлСния ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π½Π΅ ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄Π½ΠΈ лишь Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ этих ΠΈΠΌΠ΅Π½.

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ с шаблоном, эквивалСнтноС ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ ΠΏΡ€Π°Π²ΠΈΠ»Ρƒ с суффиксом .cpp:

%.cpp: %o

 $(ББ) -xc++ $(CFLAGS) -I$(INCLUDE) -с $<

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ make

Когда Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π½Π°Π΄ большими ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ, часто ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ компиляциСй Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… Π΅Π΄ΠΈΠ½ΠΈΡ† с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ β€” это Ρ„Π°ΠΉΠ»Ρ‹, Π² соотвСтствии с соглашСниСм ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ a (archive) ΠΈ содСрТащиС ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ make Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ синтаксичСская запись, которая сущСствСнно ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠΈ.

БинтаксичСская запись

lib(file.ΠΎ)
ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» file.o, хранящийся Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ lib.Π°. Π£ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
make
Π΅ΡΡ‚ΡŒ встроСнноС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ для управлСния Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ эквивалСнтно ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π΄Π°Π»Π΅Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρƒ:

.с.а:

 $(CC) -с $(CFLAGS)

Β $< $(AR) $(ARFLAGS) [email protected] $*.ΠΎ

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹

$(AR)
ΠΈ
$(ARFLAGS)
ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ
ar
ΠΈ ΠΎΠΏΡ†ΠΈΠΈ
rv
соотвСтствСнно. Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ краткая синтаксичСская запись ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ
make
ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ„Π°ΠΉΠ»Π° .с Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ .Π° слСдуСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π²Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ»Π°:

β–‘Β ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°

make
Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исходный Ρ„Π°ΠΉΠ» ΠΈ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»;

β–‘Β Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ прСдписываСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ

ar
для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉΡΡ Π² Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.

Π˜Ρ‚Π°ΠΊ, Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° fud, содСрТащая Ρ„Π°ΠΉΠ» bas.o, Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π΅

$<
замСняСтся ΠΈΠΌΠ΅Π½Π΅ΠΌ bas.c. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π΅
[email protected]
замСняСтся ΠΈΠΌΠ΅Π½Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
fud.Π°
ΠΈ
$*
замСняСтся ΠΈΠΌΠ΅Π½Π΅ΠΌ
bas
.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 9.4.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 9.4. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ

ΠŸΡ€Π°Π²ΠΈΠ»Π° управлСния Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ ΠΎΡ‡Π΅Π½ΡŒ просто ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. Π’ этом ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ Π²Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ своС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, сохранив Ρ„Π°ΠΉΠ»Ρ‹ 2.o ΠΈ 3.o Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ mylib.a. Make-Ρ„Π°ΠΉΠ» ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ лишь Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ Π΅Π³ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Makefile5 Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

all: myapp

# Какой компилятор

CC = gcc

# ΠšΡƒΠ΄Π° ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ

INSTDIR = /usr/local/bin

# Π“Π΄Π΅ хранятся Ρ„Π°ΠΉΠ»Ρ‹ include

INCLUDE =

# ΠžΠΏΡ†ΠΈΠΈ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

CFLAGS = -g -Wall -ansi

# ΠžΠΏΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ вСрсии

# CFLAGS = -O -Wall -ansi

<i># Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ</i>

<i>MYLIB = mylib.a</i>

<i>myapp: main.o $(MYLIB)</i>

<i>Β $(CC) -o myapp main.o $(MYLIB)</i>

<i>$(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)</i>

<i>main.o: main.c a.h</i>

<i>2.o: 2.c a.h b.h</i>

<i>3.o: 3.c b.h c.h</i>

<i>clean:</i>

<i>Β -rm main.o 2.o 3.o $(MYLIB)</i>

install: myapp

Β @if [ -d $(INSTDIR) ]; \

Β then \

Β  cp myapp $(INSTDIR);\

Β Β chmod a+x $(INSTDIR)/myapp;\

Β Β chmod og-w $(INSTDIR)/myapp;\

Β Β echo &quot;Installed in $(INSTDIR)&quot;;\

Β else \

Β  echo &quot;Sorry, $(INSTDIR) does not exist&quot;;\

Β fi

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ make-Ρ„Π°ΠΉΠ»Π°:

$ <b>rm -f myapp *.o mylib.a</b>

$ <b>make -f Makefile5</b>

gcc -g -Wall -ansi -с -o main.о main.c

gcc -g -Wall -ansi -с -o 2.о 2.c

ar rv mylib.a 2.o