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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++. Π‘Π±ΠΎΡ€Π½ΠΈΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 22

Автор Π”. БтСфСнс

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… нСявных ΠΏΡ€Π°Π²ΠΈΠ» GNU make, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ make -p.

НапримСр, ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ make-Ρ„Π°ΠΉΠ»Π° ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 1.18 ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ hello Ρ†Π΅Π»ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ all являСтся ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ. Π₯отя hello Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΊ Ρ†Π΅Π»ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° $(OUTPUTFILE): hello.cpp, это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π½Π΅ содСрТит ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ сцСнария, ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ½ΠΎ бСсполСзно для сборки Ρ„Π°ΠΉΠ»Π° hello. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, make выполняСт поиск Π² своСй Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.19. ΠŸΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 1.19 вмСсто подстановочного Π·Π½Π°ΠΊΠ° строку hello, make Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ с hello Π² качСствС Ρ†Π΅Π»ΠΈ.

hello: hello.cpp

    $(LINK.cpp) $(LOADLIBS) $(LDLIBS) -o [email protected]

Пока всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ взгляд Π½Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… make ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ пСрСмСнная LINK.cpp ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ раскрываСтся ΠΊΠ°ΠΊ $(LINK.cc). Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ LINK.cc ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ раскрываСтся ΠΊΠ°ΠΊ

$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)

НаконСц, пСрСмСнная CXX ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ раскрываСтся ΠΊΠ°ΠΊ g++, Π° Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ β€” $(CXXFLAGS), $(CPPFLAGS), $(LDFLAGS) ΠΈ $(TARGET_ARCH) β€” Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ пустыС строки. ПослС выполнСния всСх этих подстановок получаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ выглядит Π±ΠΎΠ»Π΅Π΅ Π·Π½Π°ΠΊΠΎΠΌΠΎ.

hello: hello.cpp

    g++ $^ -o [email protected]

Π—Π°ΠΏΡƒΡ‚Π°Π»ΠΈΡΡŒ? Π­Ρ‚ΠΎ Π½Π΅ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎ. Если Π²Ρ‹ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ объяснСниС ΠΈ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя Π½Π° ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… make, нСявныС ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚ΡƒΡ‚ смысл.

ВозмоТности для настройки

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ шаблонноС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 1.19 ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ make собираСт исполняСмый Ρ„Π°ΠΉΠ» hello ΠΈΠ· исходного Ρ„Π°ΠΉΠ»Π° hello.cpp, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹Π»ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… шагов. ΠŸΠΎΡ‡Π΅ΠΌΡƒ вмСсто слоТного ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 1.19 Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… make просто Π½Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ

%: %.cpp

    g++ $^ -ΠΎ [email protected]

ΠžΡ‚Π²Π΅Ρ‚ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ $(CXX), $(CXXFLAGS), $(CPPFLAGS) ΠΈ $(LDFLAGS), слуТат ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡ΠΊΠΈ настройки (customization points). НапримСр, ΡƒΠΊΠ°Π·Π°Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ LDFLAGS Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, Π² make-Ρ„Π°ΠΉΠ»Π΅ ΠΈΠ»ΠΈ установив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ срСды, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ CPPFLAGS ΠΈ CXXFLAGS ΠΈΠ³Ρ€Π°ΡŽΡ‚ ΡΡ…ΠΎΠΆΡƒΡŽ Ρ€ΠΎΠ»ΡŒ для ΠΎΠΏΡ†ΠΈΠΉ прСпроцСссора ΠΈ компилятора C++ соотвСтствСнно. А установив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ CXX, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ компилятор, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΎΡ‚ GCC. НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ hello с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Intel для Linux ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ make-Ρ„Π°ΠΉΠ» ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 1.18, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС ввСсти make CXX=icpc, прСдполагая, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для компилятора Intel, ΡƒΠΆΠ΅ установлСны.

VPATH ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° vpath

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.18 make ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ шаблонноС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» .cpp находится Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ создаСтся Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ». Если исходныС Ρ„Π°ΠΉΠ»Ρ‹ находятся Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Ρ‚ΠΎ для указания make, Π³Π΄Π΅ ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ†Π΅Π»ΠΈ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ пСрСмСнная VPATH.

VPATH = <ΠΏΡƒΡ‚ΡŒ-ΠΊ-Ρ„Π°ΠΉΠ»Π°ΠΌ-cpp>

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ make, Ρ‡Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ поиск ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ² трСбуСтся Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ мСстС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ vpath.

# ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ .exp Π² ../lib

vpath %. exp../lib

Π‘ΠΌΠΎΡ‚Ρ€ΠΈ Ρ‚Π°ΠΊΠΆΠ΅

Π Π΅Ρ†Π΅ΠΏΡ‚Ρ‹ 1.2 ΠΈ 1.7.

1.16. Π‘Π±ΠΎΡ€ΠΊΠ° статичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GNU Make

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ GNU make для сборки статичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° исходных Ρ„Π°ΠΉΠ»ΠΎΠ² C++, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ пСрСчислСнныС Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.1.

РСшСниС

Π’Π½Π°Ρ‡Π°Π»Π΅ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Π³Π΄Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ создана статичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, создайтС make-Ρ„Π°ΠΉΠ» ΠΈ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ Ρ†Π΅Π»ΡŒ all, СдинствСнным ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ статичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ Ρ†Π΅Π»ΡŒ статичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π•Π΅ ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Π°ΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, входящиС Π² состав Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π° Π΅Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΉ сцСнарий Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку для сборки Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π² Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π΅ 1.3. ΠŸΡ€ΠΈ использовании GCC ΠΈΠ»ΠΈ компилятора с ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ синтаксисом ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки настройтС, Ссли трСбуСтся, нСявныС ΠΏΡ€Π°Π²ΠΈΠ»Π° шаблонов, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… CXX, CXXFLAGS ΠΈ Ρ‚.ΠΏ., ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… нСявных ΠΏΡ€Π°Π²ΠΈΠ» make, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π΅ 1.15. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ синтаксис ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… ΠΏΡ€Π°Π²ΠΈΠ», описанный Π² Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π΅ 1.16, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ шаблонноС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, говорящСС make, ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΈΠ· Ρ‚Π°Π±Π». 1.8 ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ .cpp-Ρ„Π°ΠΉΠ»Ρ‹ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅. Π”Π°Π»Π΅Π΅ явно ΠΈΠ»ΠΈ нСявно ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ Ρ†Π΅Π»ΠΈ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· исходных Ρ„Π°ΠΉΠ»ΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ зависит ΠΎΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Ρ… Π² Π½Π΅Π³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ². Π­Ρ‚ΠΈ зависимости ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΈΠ»ΠΈ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… автоматичСски. НаконСц, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ†Π΅Π»ΠΈ install ΠΈ clean, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π΅ 1.15.

НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GCC Π² Unix ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΈΠ· исходных Ρ„Π°ΠΉΠ»ΠΎΠ², пСрСчислСнных Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.2, ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, создайтС Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ johnpaul make-Ρ„Π°ΠΉΠ», ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.20.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1 20. make-Ρ„Π°ΠΉΠ» для создания libjohnpaul.a с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GCC Π² Unix

# Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ„Π°ΠΉΠ»ΠΎΠ², удаляСмых ΠΏΡ€ΠΈ очисткС

CLEANEXTS - ΠΎ Π°


# Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ установки

OUTPUTFILE = libjohnpaul.a

INSTALLDIR = ../binaries


# ЦСль ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

.PHONY: all

all: $(OUTPUTFILE)

# Π‘ΠΎΠ±Π΅Ρ€ΠΈΡ‚Π΅ libjohnpaul.a ΠΈΠ· john.o. paul.o ΠΈ johnpaul.с

$(OUTPUTFILE): john.o paul.o johnpaul.ΠΎ

    ar ru [email protected] $^

    ranlib [email protected]


# Для сборки john.o, paul.o ΠΈ johnpaul.ΠΎ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² .cpp

# ΠΏΡ€Π°Π²ΠΈΠ»Π° Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ; этот процСсс обрабатываСтся Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…

# нСявных ΠΏΡ€Π°Π²ΠΈΠ» make

.PHONY: install

install:

    mkdir -p $(INSTALLDIR)

    cp -p $(OUTPUTFILE) $(INSTALLDIR)


.PHONY: clean

clean:

    for file in $(CLEANEXTS); do rm -f *.$$file; done


# Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ зависимости Ρ„Π°ΠΉΠ»ΠΎΠ² cpp ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ² .hpp

john.o: john.hpp

paul.o: paul.hpp

johnpaul.o: john.hpp paul.hpp johnpaul.hpp

Аналогично, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Visual Π‘++, ваш make-Ρ„Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.21.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1.21. make-Ρ„Π°ΠΉΠ» для создания libjohnpaul.lib с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Visual C++

# Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ„Π°ΠΉΠ»ΠΎΠ², удаляСмых ΠΏΡ€ΠΈ очисткС

CLEANEXTS = obj lib


# Specify the target file and the install directory

OUTPUTFILE = libjohnpaul.lib

INSTALLDIR = ./binaries

# Π¨Π°Π±Π»ΠΎΠ½Π½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ для сборки ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈΠ· Ρ„Π°ΠΉΠ»Π° .cpp

%.obj: %.cpp

    "$(MSVCDIR)/bin/cl" -с -nologo -EHsc -GP -Zc:forScope -Zc:wchar_t \

    $(CXXFLAGS) S(CPPFLAGS) -Fo" [email protected]" $<


# Ѐиктивная Ρ†Π΅Π»ΡŒ

.PHONY: all

all: $(OUTPUTFILE)


# Π‘ΠΎΠ±Π΅Ρ€ΠΈΡ‚Π΅ libjohnpaul.lib ΠΈΠ· john.obj, paul.obj ΠΈ johnpaul.obj

$(OUTPUTFILE): john.obj paul.obj johnpaul.obj

    "$(MSVCDIR)/bin/link" -lib -nologo -out:" [email protected]" $^


.PHONY: install

install:

    mkdir -p $(INSTALLDIR)

    cp -p $(OUTPUTFILE) $(INSTALLDIR)


.PHONY: clean

clean:

    for file in $(CLEANEXTS); do rm -f *.$$file; done


# Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ зависимости Ρ„Π°ΠΉΠ»ΠΎΠ² .cpp ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ² .hpp

john.obj: john.hpp

paul.obj: paul.hpp

johnpaul.obj: john.hpp paul.hpp johnpaul.hpp

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.21 я с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ срСды MSVCDIR, устанавливаСмой Π² vcvars32.bat, ΠΏΠΎΠΊΠ°Π·Π°Π» ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Visual C++ link.exe ΠΊΠ°ΠΊ "$(MSVCDIR)/bin/link". Π­Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ Visual C++ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Unix link, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ Cygwin ΠΈ MSYS. Для ΠΏΠΎΠ»Π½ΠΎΡ‚Ρ‹ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρ‹ я Ρ‚Π°ΠΊΠΆΠ΅ использовал MSVCDIR для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ компиляции Visual Π‘++.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 1.20. Π’Π½Π°Ρ‡Π°Π»Π΅ я ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ», Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ установки ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ сборкС Ρ†Π΅Π»ΠΈ clean. Π—Π°Ρ‚Π΅ΠΌ я объявляю Ρ†Π΅Π»ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ all, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.14.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ для сборки статичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ выглядит Ρ‚Π°ΠΊ.

$(OUTPUTFILE): john.o paul.o johnpaul.ΠΎ

    ar ru [email protected] $^

    ranlib [email protected]

Π­Ρ‚ΠΎ нСпосрСдствСнная адаптация записи для GCC ΠΈΠ· Ρ‚Π°Π±Π». 1.10. Π—Π΄Π΅ΡΡŒ $(OUTPUTFILE) ΠΈ [email protected] Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ libjohnpaul.a, Π° $^ раскрываСтся Π² Π²ΠΈΠ΄Π΅ списка ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ΠΎΠ² john.o paul.o johnpaul.ΠΎ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π° ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ Ρ†Π΅Π»ΠΈ install ΠΈ clean, ΠΊΠ°ΠΊ Π² Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π΅ 1.15. ЕдинствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.20 для удалСния всСх Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‡ΡŒΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π² спискС ΠΎ Π° β€” Ρ‚. Π΅. всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ статичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, - я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Ρ†ΠΈΠΊΠ» ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ.

for file in $(CLEANEXTS); do rm -f *.$$file; done